构建Jmeter+Grafana+InfluxDB+Prometheus一体化性能测试监控平台
1. 项目概述为什么需要一个集成的性能测试环境如果你做过性能测试尤其是用Jmeter跑过压测大概率经历过这样的场景脚本跑起来了TPS曲线看着还行但服务器CPU到底吃紧到什么程度内存有没有泄漏网络IO是不是瓶颈Jmeter自带的聚合报告和监听器数据是静态的图表简陋而且一旦测试结束想回溯分析某个时间点的系统状态几乎不可能。更别提团队协作时如何让开发和运维同学直观地看到“压测这一刻系统到底在经历什么”。这就是为什么我们需要搭建一个集成的性能测试环境。它不是一个简单的Jmeter安装而是一个数据采集、存储、展示和告警的闭环。Jmeter负责产生负载InfluxDB作为高性能时序数据库存储海量的性能指标Grafana则用华丽的仪表盘将数据可视化而Prometheus则能监控被测系统SUT自身的资源状态。这一切都跑在稳定、可控的Linux服务器上。我搭建过不下十套这样的环境从单机到分布式。今天分享的这套“JmeterGrafanaInfluxDBPrometheusLinux”组合可以说是当前社区最主流、最成熟、也最容易上手的方案。它能让你从“跑个脚本看看结果”的初级阶段进化到“实时监控、精准定位、数据驱动”的性能测试专业阶段。无论你是测试工程师、开发工程师还是运维工程师这套环境都能让你对系统性能有前所未有的掌控感。2. 环境整体架构与核心组件选型在动手之前我们必须先理清各个组件在这个体系中的角色和它们之间的数据流向。这就像盖房子先看图纸能避免后面接线时的一头雾水。2.1 核心组件职责解析整个架构可以看作一个数据流水线压力发生器 (Jmeter)它是数据的源头。通过运行测试计划模拟用户请求并生成两大类数据采样器结果每个请求的响应时间、状态码、字节数等。测试元数据线程数、TPS、吞吐量、错误率等聚合指标。 Jmeter本身并不擅长长期存储和展示这些数据它的角色是“生产者”。时序数据库 (InfluxDB)它是数据的仓库。专门为处理时间序列数据即带时间戳的数据点而优化写入和查询速度极快。Jmeter通过一个叫Backend Listener的监听器将实时产生的性能数据以HTTP协议推送到InfluxDB中存储起来。InfluxDB的核心概念是Measurement类似表、Tag索引标签如transaction_name,status和Field数值字段如response_time,bytes。这种结构非常适合做高效的多维度聚合查询。数据可视化平台 (Grafana)它是数据的展示窗口。Grafana本身不存储数据它只是一个强大的“画板”。它通过配置数据源Data Source连接到InfluxDB和Prometheus然后你可以用SQL-like的查询语言InfluxQL或Flux从数据库中提取数据绘制成各种精美的图表如实时TPS曲线、响应时间分布、错误率趋势等。你可以把多个图表组织在一个Dashboard仪表盘里实现性能全景监控。系统监控器 (Prometheus)它是被测系统的“体检仪”。Jmeter监控的是业务层面的性能而Prometheus监控的是服务器资源层面。它通过Pull模型定期从部署在被测服务器上的Node Exporter暴露主机指标和JMX Exporter暴露JVM应用指标等抓取数据。这些数据如CPU使用率、内存占用、磁盘IO、GC次数同样可以展示在Grafana中与Jmeter的业务指标进行时间对齐让你一眼就能看出“TPS下降时CPU是不是已经飙到100%了”。操作系统基石 (Linux)推荐使用CentOS 7/8或Ubuntu 20.04/22.04 LTS。选择Linux是因为其稳定性、资源开销小以及强大的命令行工具非常适合作为长期运行的服务器环境。所有上述组件都将部署在这台Linux服务器上。数据流总结 Jmeter (压测数据) -- InfluxDB (存储) -- Grafana (展示) Prometheus (抓取) -- 被测系统指标 -- Grafana (展示)2.2 为什么是这套组合你可能会问为什么不用JmeterELK或者直接用云上的压测服务这里面的选型考量很实际JmeterInfluxDBGrafana (JIG) 组合的成熟度这个组合在性能测试社区经过多年实践有海量的现成模板和教程。Jmeter的Backend Listener对InfluxDB的支持是原生的配置简单。资源与成本这套方案全部由开源软件组成可以部署在自有服务器或虚拟机中数据完全自主可控长期成本低于商业云压测服务。功能互补Prometheus的引入补足了Jmeter在系统资源监控上的短板形成了“业务压力系统负载”的完整监控视图。灵活性Grafana可以同时连接InfluxDB和Prometheus两个数据源在一个面板里关联分析业务指标和系统指标这是很多单一工具做不到的。注意对于超大规模分布式压测单机InfluxDB可能成为瓶颈。此时需要考虑InfluxDB集群版或使用其他时序数据库如TDengine。但对于绝大多数中小型项目和日常性能验证单机版完全够用。3. Linux服务器基础环境准备我们假设你有一台全新的CentOS 8 Stream或Ubuntu 22.04服务器。以下所有操作均通过SSH在终端进行。3.1 系统更新与基础工具安装首先确保系统是最新的并安装后续需要的工具如wget、vim等。# 对于CentOS/RHEL系 sudo yum update -y sudo yum install -y wget vim net-tools # 对于Ubuntu/Debian系 sudo apt update sudo apt upgrade -y sudo apt install -y wget vim net-tools3.2 防火墙与SELinux配置为了组件间能正常通信需要开放相关端口。这里我们暂时关闭防火墙和SELinux以简化流程生产环境请按需配置安全组和精细规则。# 关闭防火墙 (CentOS 8) sudo systemctl stop firewalld sudo systemctl disable firewalld # 关闭SELinux (需要重启生效) sudo setenforce 0 sudo sed -i s/^SELINUXenforcing/SELINUXdisabled/ /etc/selinux/config # 对于Ubuntu默认是ufw可以禁用或开放端口 sudo ufw disable开放关键端口如果防火墙开启3000: Grafana Web界面8086: InfluxDB HTTP API9090: Prometheus Server9100: Node Exporter (用于Prometheus抓取主机指标)8089: Jmeter可能使用的RMI端口分布式压测时3.3 Java环境安装 (Jmeter依赖)Jmeter是基于Java的需要安装JDK 8或11。这里选择安装OpenJDK 11。# CentOS sudo yum install -y java-11-openjdk-devel # Ubuntu sudo apt install -y openjdk-11-jdk # 验证安装 java -version4. 核心组件部署与配置详解我们将按照数据流的顺序来安装先安装数据存储InfluxDB再安装数据展示Grafana和系统监控Prometheus最后配置压力发生器Jmeter。4.1 部署时序数据库 InfluxDBInfluxDB 1.x版本安装配置更简单社区资源也更丰富我们选择它。下载并安装wget https://dl.influxdata.com/influxdb/releases/influxdb-1.8.10.x86_64.rpm # CentOS # 对于Ubuntu下载 .deb 包wget https://dl.influxdata.com/influxdb/releases/influxdb_1.8.10_amd64.deb sudo yum localinstall -y influxdb-1.8.10.x86_64.rpm # Ubuntu使用 sudo dpkg -i influxdb_1.8.10_amd64.deb启动并设置开机自启sudo systemctl start influxdb sudo systemctl enable influxdb sudo systemctl status influxdb # 检查状态应为 active (running)初始化配置 InfluxDB启动后默认HTTP API在8086端口。我们需要创建一个数据库来存储Jmeter的数据。# 进入InfluxDB命令行 influx在influx提示符下执行-- 创建名为 jmeter 的数据库 CREATE DATABASE jmeter -- 查看数据库 SHOW DATABASES -- 退出 exit现在Jmeter就可以向jmeter数据库写入数据了。实操心得InfluxDB 1.x的配置文件位于/etc/influxdb/influxdb.conf。对于压测场景你可能需要调整[http]下的max-row-limit默认10000和[data]下的cache-max-memory-size以防止查询时数据被截断或内存不足。但初次搭建默认配置即可。4.2 部署数据可视化平台 GrafanaGrafana的安装同样直接。下载并安装wget https://dl.grafana.com/oss/release/grafana-10.0.0-1.x86_64.rpm # CentOS版本号请检查官网最新 sudo yum localinstall -y grafana-10.0.0-1.x86_64.rpm # Ubuntu: sudo apt-get install -y adduser libfontconfig1 # wget https://dl.grafana.com/oss/release/grafana_10.0.0_amd64.deb # sudo dpkg -i grafana_10.0.0_amd64.deb启动并设置开机自启sudo systemctl start grafana-server sudo systemctl enable grafana-server sudo systemctl status grafana-server初始访问与配置 打开浏览器访问http://你的服务器IP:3000。默认用户名和密码都是admin。首次登录会要求修改密码。添加数据源这是最关键的一步。点击左侧齿轮图标 -Data Sources-Add data source。选择InfluxDB。HTTPURL 填写http://localhost:8086如果Grafana和InfluxDB在同一台机器。InfluxDB Details部分Database填写我们刚才创建的jmeter。其他保持默认点击Save Test应该看到绿色的“Data source is working”提示。4.3 部署系统监控器 PrometheusPrometheus的部署包含两部分Prometheus Server和Node Exporter用于收集主机指标。创建Prometheus用户和目录sudo useradd --no-create-home --shell /bin/false prometheus sudo mkdir /etc/prometheus /var/lib/prometheus sudo chown prometheus:prometheus /etc/prometheus /var/lib/prometheus下载并安装Prometheus Servercd /tmp wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz tar -xvf prometheus-2.45.0.linux-amd64.tar.gz cd prometheus-2.45.0.linux-amd64 sudo cp prometheus promtool /usr/local/bin/ sudo cp -r consoles/ console_libraries/ /etc/prometheus/ sudo chown -R prometheus:prometheus /etc/prometheus /usr/local/bin/prometheus /usr/local/bin/promtool配置Prometheus 创建配置文件/etc/prometheus/prometheus.yml。sudo vim /etc/prometheus/prometheus.yml输入以下基础配置global: scrape_interval: 15s # 抓取间隔 scrape_configs: - job_name: prometheus # 监控Prometheus自身 static_configs: - targets: [localhost:9090] - job_name: node_exporter # 监控Linux主机 static_configs: - targets: [localhost:9100] # Node Exporter的地址创建Systemd服务文件并启动sudo vim /etc/systemd/system/prometheus.service内容如下[Unit] DescriptionPrometheus Wantsnetwork-online.target Afternetwork-online.target [Service] Userprometheus Groupprometheus Typesimple ExecStart/usr/local/bin/prometheus \ --config.file /etc/prometheus/prometheus.yml \ --storage.tsdb.path /var/lib/prometheus/ \ --web.console.templates/etc/prometheus/consoles \ --web.console.libraries/etc/prometheus/console_libraries [Install] WantedBymulti-user.target启动服务sudo systemctl daemon-reload sudo systemctl start prometheus sudo systemctl enable prometheus sudo systemctl status prometheus访问http://你的服务器IP:9090可以打开Prometheus自带的Web UI。部署Node Exporter Node Exporter需要部署在所有你想监控的服务器上包括这台部署机本身。cd /tmp wget https://github.com/prometheus/node_exporter/releases/download/v1.6.0/node_exporter-1.6.0.linux-amd64.tar.gz tar -xvf node_exporter-1.6.0.linux-amd64.tar.gz sudo cp node_exporter-1.6.0.linux-amd64/node_exporter /usr/local/bin/ sudo chown prometheus:prometheus /usr/local/bin/node_exporter创建服务文件sudo vim /etc/systemd/system/node_exporter.service[Unit] DescriptionNode Exporter Afternetwork.target [Service] Userprometheus Groupprometheus Typesimple ExecStart/usr/local/bin/node_exporter [Install] WantedBymulti-user.target启动服务sudo systemctl daemon-reload sudo systemctl start node_exporter sudo systemctl enable node_exporter sudo systemctl status node_exporter现在Node Exporter在9100端口暴露主机指标Prometheus会根据配置去抓取。在Grafana中添加Prometheus数据源 回到Grafana像添加InfluxDB一样添加一个Prometheus类型的数据源。URL填写http://localhost:9090保存并测试。4.4 配置压力发生器 JmeterJmeter需要安装在执行压测的机器上这台机器可以是前面部署的Linux服务器本地压测也可以是另一台Windows/Mac/Linux机器远程压测。这里以在Linux部署机上安装为例。下载并安装Jmetercd /opt sudo wget https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.6.2.tgz sudo tar -xzf apache-jmeter-5.6.2.tgz sudo ln -s /opt/apache-jmeter-5.6.2 /opt/jmeter # 创建软链接方便使用配置环境变量可选但推荐echo export JMETER_HOME/opt/jmeter ~/.bashrc echo export PATH$JMETER_HOME/bin:$PATH ~/.bashrc source ~/.bashrc验证jmeter -v应输出版本信息。配置Jmeter的Backend Listener连接InfluxDB 这是打通Jmeter和InfluxDB的关键。你需要一个额外的jar包jmeter-influxdb2-listener。但由于我们用的是InfluxDB 1.xJmeter自带的Backend Listener就支持。打开Jmeter GUI在图形界面机器上操作更直观/opt/jmeter/bin/jmeter在测试计划中右键添加 - 监听器 - Backend Listener。在Backend Listener implementation中选择org.apache.jmeter.visualizers.backend.influxdb.InfluxdbBackendListenerClient。关键参数配置influxdbMetricsSender保持默认org.apache.jmeter.visualizers.backend.influxdb.HttpMetricsSender。influxdbUrlhttp://你的InfluxDB服务器IP:8086/write?dbjmeter(例如http://localhost:8086/write?dbjmeter)application 你的应用名会作为InfluxDB中的一个tag用于区分不同项目。measurement 默认为jmeter这是InfluxDB中的表名。summaryOnly 如果为true只发送聚合数据如TPS平均响应时间为false会发送每个采样器的详细数据。初次调试建议设为false生产压测可设为true以减少数据量。samplersRegex 匹配哪些采样器的数据要发送.*表示全部。无GUI模式运行命令示例jmeter -n -t /path/to/your_test_plan.jmx -l /path/to/result.jtl -e -o /path/to/html_report -JinfluxdbUrlhttp://localhost:8086/write?dbjmeter这里通过-J参数将influxdbUrl传递给测试计划中的Backend Listener。5. 构建性能监控仪表盘组件都跑起来了现在我们来让数据“活”起来在Grafana中创建直观的仪表盘。5.1 导入Jmeter性能监控模板社区有大量现成的Grafana Dashboard模板我们可以直接导入快速获得一个专业的视图。在Grafana官网的Dashboards页面 (https://grafana.com/grafana/dashboards/) 搜索 “JMeter”。找到一个评分高、使用量大的模板例如ID为5496的 “JMeter Dashboard using Core InfluxdbBackendListenerClient”。在Grafana界面点击Create(加号图标) -Import。在Import via grafana.com框中输入模板ID5496点击Load。在下一步中选择我们之前创建的InfluxDB数据源然后点击Import。瞬间一个包含实时TPS、响应时间、活动线程数、错误率等丰富图表的专业仪表盘就出现了。你可以看到Jmeter正在运行的测试数据实时刷新。5.2 创建系统资源监控面板光有业务指标不够我们还需要看服务器资源。同样使用模板导入。在Grafana官网搜索 “Node Exporter Full” 导入ID为1860的模板。导入时选择Prometheus数据源。导入后你将获得一个全面的主机监控面板涵盖CPU、内存、磁盘、网络、负载等所有关键指标。5.3 关键图表配置与解读理解核心图表的意义比单纯导入更重要。TPS (Throughput per Second) 每秒事务数。这是衡量系统处理能力的核心指标。图表应该是相对平稳的曲线如果出现剧烈下跌说明系统可能遇到了瓶颈或错误。Response Times (响应时间) 通常关注平均值、90分位值90%的请求响应时间低于此值和95分位值。90/95分位值比平均值更能反映用户体验长尾请求的影响在这里。Active Threads (活动线程数) 应与你的线程组配置相符是负载是否正常发起的直观体现。Errors (%) 错误率。任何非零的错误率都需要重点关注。CPU Usage Memory Usage 来自Prometheus。将业务指标如TPS和系统指标如CPU放在同一个时间轴上看能清晰定位瓶颈。例如TPS上不去但CPU已接近100%说明可能是计算密集型瓶颈如果CPU空闲但TPS低可能是IO或外部依赖瓶颈。你可以将这两个导入的仪表盘放在同一个Grafana文件夹中甚至可以将关键的图表如TPS和CPU使用率复制到同一个自定义仪表盘里进行关联观察。6. 全链路压测实操与数据关联分析环境搭建好了仪表盘也有了现在我们来跑一次真正的压测并学习如何分析数据。6.1 设计一个简单的压测场景假设我们有一个简单的HTTP APIhttp://your-api-server/api/v1/hello(GET)。我们用Jmeter模拟100个用户在60秒内逐渐启动然后持续运行2分钟。创建测试计划线程组线程数100Ramp-Up时间60秒循环次数“永远”持续时间120秒。HTTP请求协议http服务器名称your-api-server路径/api/v1/hello。添加Backend Listener按第4.4节配置好InfluxDB连接。添加查看结果树和聚合报告用于本地调试正式压测时建议禁用以减少资源消耗。执行压测 在部署了Jmeter的机器上使用无GUI模式运行jmeter -n -t hello_api_test.jmx -l result.jtl -JinfluxdbUrlhttp://localhost:8086/write?dbjmeter6.2 实时监控与问题定位运行命令后立即切换到Grafana的JMeter仪表盘。观察阶段在Ramp-Up的60秒内你会看到Active Threads线性增长TPS也随之爬升Response Time可能保持稳定或略有波动。稳定阶段100个线程全部启动后进入2分钟稳定压测期。理想状态下TPS曲线应保持在一个稳定的高位Response Time平稳Errors为0。关联分析同时打开Node Exporter仪表盘。如果发现TPS曲线无法继续上升甚至开始下降而CPU使用率接近100%并且Load Average系统负载远高于CPU核心数这很可能意味着应用服务器CPU已成为瓶颈。如果TPS下降但CPU不高可以查看Memory是否耗尽导致Swap或者Network Traffic是否达到带宽上限。6.3 压测后的数据分析与报告压测结束后Grafana仪表盘上的数据依然存在你可以灵活地调整时间范围回顾压测全过程。确定系统容量稳定阶段TPS的平均值可以认为是当前配置下的系统大致容量。分析稳定性观察响应时间曲线是否平稳90分位值与平均值的差距是否过大。差距过大说明有部分请求体验很差。定位瓶颈点结合Prometheus的系统指标明确瓶颈是CPU、内存、磁盘IO还是网络。例如如果磁盘IO Util持续在90%以上说明磁盘是瓶颈。生成报告Grafana每个面板都可以通过“Share”功能生成一个链接或直接导出为PDF/PNG方便集成到你的测试报告中。踩坑实录有一次压测TPS在达到某个值后剧烈抖动。查看Grafana错误率并未上升。后来关联Prometheus的监控发现应用服务器的TCP连接数在TIME_WAIT状态堆积极快达到了端口数限制。原因是后端服务HTTP连接未正确复用。这个问题单看Jmeter报告很难发现正是JmeterPrometheus的组合监控让我们快速定位到了网络层面的瓶颈。7. 常见问题排查与性能调优要点搭建和使用过程中你肯定会遇到各种问题。这里记录一些典型问题的排查思路。7.1 数据写入问题Jmeter数据未出现在Grafana中这是最常见的问题。按照以下步骤排查检查InfluxDB服务与数据库systemctl status influxdb influx -execute SHOW DATABASES # 确认jmeter数据库存在 influx -database jmeter -execute SHOW MEASUREMENTS # 压测后查看是否有数据表检查Jmeter Backend Listener配置influxdbUrl是否正确特别注意IP、端口和/write?dbjmeter参数。运行Jmeter时观察控制台日志是否有关于“Error writing to influxdb”的错误。可以临时在测试计划中添加一个Debug Sampler和View Results Tree查看Backend Listener是否被正确执行。检查网络连通性在Jmeter机器上用curl命令测试InfluxDB的写入接口。curl -i -XPOST http://influxdb-server:8086/write?dbjmeter --data-binary test_measurement,tag1value1 field1123然后去InfluxDB查询influx -database jmeter -execute SELECT * FROM test_measurement如果curl成功但Jmeter不行可能是Jmeter的HTTP实现或代理设置问题。7.2 Grafana图表显示“No Data”检查数据源连接在Grafana的数据源配置页面点击“Save Test”确保连接成功。检查查询语句点击图表标题 - Edit。检查InfluxQL或Flux查询语句是否正确引用了Measurement和Field。可以参考导入的模板里的查询。检查时间范围确保Grafana右上角的时间范围选择器覆盖了你的压测执行时间段。检查数据字段类型InfluxDB中字段Field有类型float, integer, string, boolean。Jmeter写入的响应时间通常是float。如果你的查询里对字符串字段做了数学运算就会出错。在InfluxDB命令行用SHOW FIELD KEYS FROM “jmeter”可以查看字段类型。7.3 Prometheus抓取不到Node Exporter数据检查Node Exporter服务systemctl status node_exporter确保它在运行并监听9100端口netstat -tlnp | grep 9100。检查Prometheus配置确认prometheus.yml中node_exporterjob的targets地址和端口正确。检查Prometheus Targets访问Prometheus Web UI (:9090)点击Status-Targets。查看node_exporterjob的状态是否为UP。如果是DOWN将鼠标悬停在错误信息上会显示具体原因如连接拒绝。检查防火墙确保9100端口在监控主机上对Prometheus服务器开放。7.4 压测时InfluxDB或Grafana本身负载过高当压测规模很大时数据写入和查询可能成为瓶颈。InfluxDB调优调整配置编辑/etc/influxdb/influxdb.conf增加[http]下的max-concurrent-write-limit和max-enqueued-write-limit。调整[data]下的cache-snapshot-memory-size和cache-max-memory-size。使用批量写入确保Jmeter的Backend Listener中的queueSize参数设置合理默认5000它控制内存队列大小批量写入效率更高。硬件升级InfluxDB对磁盘IOPS和内存比较敏感使用SSD磁盘能极大提升性能。Grafana调优减少仪表盘上不必要的图表和面板数量。增加查询的时间间隔避免过于精细的实时刷新。考虑为Grafana配置更强大的后端服务器。7.5 Jmeter分布式压测环境整合单机Jmeter可能无法产生足够压力需要分布式压测。Controller与Agent一台机器作为Controller运行GUI控制测试多台机器作为Agent执行器jmeter-server进程。关键配置在所有Agent机器上修改/opt/jmeter/bin/jmeter.properties中的server.rmi.ssl.disabletrue简化配置生产环境建议启用SSL。在Controller机器的测试计划中Backend Listener的influxdbUrl仍然指向统一的InfluxDB服务器。运行Controller时使用-R agent1_ip:port,agent2_ip:port参数指定Agent。数据汇总所有Agent的测试结果都会通过其自身的Backend Listener发送到同一个InfluxDB数据自然汇聚。在Grafana中你可以通过transaction_name等tag区分不同Agent的压力但通常我们更关注全局聚合指标。从一张白纸般的Linux服务器到能够实时呈现业务压力与系统资源全景视图的监控仪表盘这套环境的搭建过程本身就是一次对性能测试体系化思维的深度实践。我个人的体会是初期花一两天时间搭建和调试是值得的它带来的效率提升和问题定位能力是质的飞跃。当你再也不用在压测时手忙脚乱地登录服务器敲top命令当你能在会议中直接调出带有时间戳的图表指出“在10:15分TPS下降与数据库连接池耗尽完全吻合”时你会发现所有的投入都物超所值。最后分享一个小技巧将你的Grafana仪表盘设置为公开只读链接分享给开发和产品同事。让他们也能实时看到压测效果这能极大地促进团队对性能目标的共识让性能测试从测试部门的“黑盒”变成全团队关注的“白盒”。

相关新闻