1. 为什么推荐把这三个工具搅在一起
做性能测试的朋友,大概率都经历过这个尴尬场景:JMeter 脚本跑起来了,压测正在进行,可你只能干瞪眼等聚合报告最终结果。聚合报告是静态的,要等测试结束才能看到完整数据;就算实时看着查看结果树,也只能看到一堆绿色红色,压根谈不上"实时监控"。
后来我换成了JMeter + InfluxDB + Grafana这套组合,情况完全不同。JMeter 负责发压,InfluxDB 负责存时序数据,Grafana 负责把数据画成看得懂的曲线面板。压测从启动那一刻起,吞吐量、响应时间、错误率、线程数全都在大屏上实时跳动,哪里出现拐点、哪个接口开始变慢,一眼就能看出来。
这套方案特别适合搞接口压测、全链路压测或者日常性能回归的人。不管你是刚接触性能测试的小白,还是已经折腾过一段时间的老手,只要想把压测过程看得明明白白,这套组合都值得搭建一次。
我先说结论:这套方案最大的价值不是"看上去很酷",而是它把性能测试从"跑完看报告"变成了"边跑边看趋势",让你在测试过程中就能发现瓶颈、定位问题,而不是等全部跑完才发现数据异常,还得重跑一遍。
2. 搭建前的方案选型与组件认知
2.1 三个组件各自扮演什么角色
JMeter是压测工具,这个不用多解释。但它本身有个短板:虽然自带监听器,比如聚合报告、图形结果,但这些结果都保存在内存里,测试一停数据就没了,而且不适合做长时间压测的趋势分析。
InfluxDB是时序数据库,简单说就是专门用来存储"按时间变化的数据"的数据库。压测过程中每秒都会产生大量指标数据,比如当前并发数、响应时间、TPS 等,这些数据天然适合用时序库来存储。InfluxDB 能把这些数据按时间顺序排好,写入和查询速度都很快。
Grafana是可视化平台,从 InfluxDB 里查数据,然后把数据画成折线图、柱状图、仪表盘,支持自定义面板,还能多个数据源整合到一个仪表盘里。它的界面是网页版的,浏览器打开就能看,非常适合放在显示器上做大屏监控。
打个比方,JMeter 是发电厂,InfluxDB 就是蓄水池,Grafana 是把水表装在你家客厅的仪表盘。电厂发多少电、水流多快,你在客厅随时能看清楚。
2.2 版本选型,先说避坑经验
JMeter:建议直接用当前最新的稳定版,比如 5.4 以上。老版本有些监听器配置选项对不上,网上资料也比较少,遇到问题不好排查。JMeter 是 Java 写的,需要提前装好 JDK 8 以上的环境。验证方式很简单,命令行输入java -version能正常输出就行。
InfluxDB:这里有个重要分叉点。InfluxDB 1.x 和 2.x 的差异非常大,从端口、数据库概念到 API 写法完全不一样。如果你是为了跟 JMeter 搭配搭建压测监控,我个人强烈建议用 InfluxDB 1.8。原因很简单:JMeter 的后端监听器(Backend Listener)官方推荐的客户端就是适配 InfluxDB 1.x 的,网上能找到的模板、教程九成以上都基于 1.8,出现问题能搜到现成的解决方案。2.x 引入了 token 认证、bucket 等新概念,JMeter 接入需要额外写 Flux 查询脚本,折腾成本高不少,收益却不大。
Grafana:版本相对没那么敏感,下载最新的稳定版即可,默认端口是 3000。Grafana 主要靠浏览器访问,只要服务器能开网页就行。
2.3 组件安装与启动流程
三个组件都是免安装的绿色软件,解压即用。
InfluxDB 1.8解压后打开配置文件 influxdb.conf,重点确认两处:bind-address和[http]部分。默认 HTTP 端口是 8086,不用改。启动方式是命令行进入解压目录,执行influxd(注意是 influxd,带 d 的是服务端)。启动成功后访问http://服务器IP:8086/ping,返回正常内容就说明服务起来了。
Grafana解压后,Linux 下执行bin/grafana-server,Windows 下执行grafana-server.exe。默认端口 3000,浏览器打开http://服务器IP:3000,首次登录账号密码都是 admin。登录后系统会强制让你改密码,不着急的话可以先改成简单密码。
JMeter解压后 Windows 下双击bin/jmeter.bat,Linux/mac 下运行bin/jmeter.sh。看到 JMeter 界面弹出来就说明 OK 了。
安装这块基本没有难度,但我还是建议把三个组件都放到一台专门跑监控的机器上,而不是放在压测机(发压的那台机器)上。因为高强度压测时,压测机本身的 CPU 和内存可能已经占用很高,如果再让 Grafana 渲染、让 InfluxDB 写入磁盘,可能会出现监控数据延迟甚至丢失,反而影响判断。尤其是 InfluxDB 的磁盘 IO 消耗比较大,放在压测机上很容易拉低压测机的性能,导致测试结果出现明显的"断崖式下跌",但其实是监控组件在抢资源。
3. 打通 JMeter 与 InfluxDB 的数据链路
3.1 创建数据库和保留策略
InfluxDB 1.x 启动后,先在服务器上用命令行创建数据库。进入 InfluxDB 解压目录,执行influx进入命令行客户端,然后执行:
CREATE DATABASE jmeter; SHOW DATABASES;正常情况下能看到 jmeter 这个库。这一步其实就是在蓄水池里划了一块区域出来,JMeter 的数据专门往这块区域写。
这里提一下保留策略的问题。默认情况下新建数据库会带一个autogen的保留策略,数据无限期保存。压测数据如果一直堆积,磁盘迟早被吃满。我建议做一次压测就清一次数据,或者创建一条保留策略:
CREATE RETENTION POLICY "rp_7d" ON "jmeter" DURATION 7d REPLICATION 1 DEFAULT;这条命令的意思是:jmeter 库里的数据只保留 7 天,超过自动清理。压测数据一般不需要长期留存,保住最近几次的结果就够复盘了。
3.2 JMeter 后端监听器配置
这是整个搭建过程最核心的一步。打开 JMeter,在你的测试计划下添加一个"监听器 → 后端监听器"(Backend Listener)。这个监听器跟普通的聚合报告不一样,它专门负责把测试过程中的指标数据实时推送到外部存储。
后端监听器有两个关键配置项:后端监听器实现和参数配置。
后端监听器实现选择org.apache.jmeter.visualizers.backend.influxdb.InfluxdbBackendListenerClient,这个是 JMeter 官方提供、专门用于对接 InfluxDB 的客户端实现。
参数配置里最重要的三个参数:
- influxdbUrl:形如
http://监控机IP:8086/write?db=jmeter,注意这个 URL 已经带上了/write?db=jmeter,表示往 jmeter 这个库写入数据。 - application:这是用来区分不同测试计划的标签,比如
app_test、order_interface。强烈建议每类压测任务用不同的 application 名,后续在 Grafana 里筛选不同压测场景就靠它。 - testTitle:当前测试的名称,会显示在监控面板上,方便识别正在跑的是哪一轮测试。
其余参数比如samplersRegex可以通过正则过滤要采集的 sampler,默认留空就行。percentiles参数控制要统计的百分位,默认 99、95、50 三个常用的。如果只关心 95 线,改成 95 就行,面板里就会少一条线。
配置完这些参数后,一定要保存测试计划再试跑一次。压测过程中,数据会源源不断地写入 InfluxDB。
3.3 验证数据是否真正写入
这一步很多人会跳过,但恰恰是排查问题最有效的动作。压测运行十几秒后,回到服务器命令行,进入 influx 客户端执行查询:
USE jmeter; SELECT * FROM jmeter LIMIT 5;正常情况下能看到返回结果,里面有application、testTitle、avg、count、max、min、pct95、pct99等字段。看到这些字段,说明 JMeter → InfluxDB 这条链路已经通了。
提示:如果 SELECT 查询什么都查不到,先别急着翻 Grafana,问题大概率出在后端监听器的 influxdbUrl 写错了,或者数据库名称对不上。先在这一步把数据问题定位干净,再去折腾 Grafana。
4. Grafana 面板配置与自定义指标
4.1 添加 InfluxDB 数据源
浏览器打开 Grafana 地址,登录后进入 Dashboard 管理。第一步先添加数据源,点击页面左侧的"设置"图标(齿轮),进入"Data Sources",然后 "Add data source"。
数据源类型选InfluxDB,注意选 1.x 的版本。填写三个关键信息:
- URL:填写
http://监控机IP:8086,不要写数据库名,这是数据源层连接 influxdb 服务本身。 - Database:填写
jmeter,就是刚才创建的数据库名。 - HTTP Method:建议选 GET。
填完点击 "Save & Test",如果提示数据库连通正常,说明 Grafana 和 InfluxDB 已经打通了。
4.2 导入模板,快速拥有专业面板
手写 Grafana 面板比较费时间,好在社区已经提供了大量现成的 JMeter 监控模板。InfluxDB 1.x 的经典模板里,我比较推荐 ID 为 5496 的那套(JMeter InfluxDB Dashboard),支持查看当前并发数、响应时间分布、TPS 曲线、错误率等核心指标。
导入模板的方法:在 Grafana 里点击"+"号 → "Import",输入模板 ID,然后在下方选择刚才配置好的数据源,确认导入。如果网络环境不方便在线拉模板,也可以直接下载 JSON 文件后通过 "Upload JSON file" 的方式导入。
有朋友会问,模板 ID 是不是必须记住?其实不用,直接在 Grafama 官网 Dashboard 页面搜索 "JMeter InfluxDB" 就能找到一堆。找的时候留意一下模板适配的数据源类型,有的模板是适配 Prometheus 数据源的,跟 InfluxDB 不匹配,导进去也显示不了数据。
4.3 常用指标说明与面板微调
模板导入后,你会看到一排排图表。挑几个最常用的指标简单说明:
Test started / Running Time:测试开始时间和已运行时长,方便确认当前测试的状态。
Total Threads / Active Threads:显示当前并发线程数,这条曲线能直观反映压测的线程增减过程,比如爬坡是否按预期进行、线程是否在某时刻突然掉线。
Avg Response Time:平均响应时间曲线,如果出现断崖式上涨,大概率是系统处理不过来开始排队了。
TPS / Throughput:吞吐量,每秒完成的请求数。这条曲线跟响应时间曲线配合着看,能判断系统的处理容量边界。
Error Rate:错误率,接口报错的比例。压测过程中错误率突然升高,是异常最直接的信号。
Http Code 响应码拆分:有的模板会展示 200、404、500 等状态码的分布情况,对于接口压测非常实用。
模板里的面板布局不一定是完全符合你需求的,可以点每个面板的编辑按钮修改查询,也可以拖拽调整位置。比如我把响应时间拆成了 95 线和 99 线两张图,因为这两个指标对用户体验的判断比平均值敏感得多。
4.4 数据聚合写法与核心查询逻辑
如果你需要自己在 Grafana 里写查询,还是要懂一点 InfluxQL 基础。JMeter 写入的数据都带 tags,比如 application、testTitle、samplers 等,这些是可以在查询里用于过滤的维度。
比如我想看某个特定测试计划的 TPS,查询可以这样写:
SELECT sum("count") FROM "jmeter" WHERE ("application" = 'my_app') AND $timeFilter GROUP BY time(1s)$timeFilter是 Grafana 自动带入的时间范围参数。GROUP BY time(1s)表示按秒聚合,出来的就是每秒的请求总量。如果模板里已经写好了查询,尽量不要动,但如果你发现模板里的字段跟你实际写入的字段对不上,就可能需要按上面这种方式手写。
以前有朋友问到sum by的用法,这其实更多是 PromQL(Prometheus 查询语言)里的语法,用在 Grafana + Prometheus 的监控体系里。如果你只用 JMeter + InfluxDB,这个地方不用纠结 InfluxQL 就够了。
5. 常见问题与排查技巧实录
这套方案我搭过不下十次,有些问题反复出现,整理成一份排查速查表,按这个顺序检查大概率能救你于水火。
5.1 Grafana 面板没有数据的排查顺序
这是最常遇到的问题,面板是有的,就是不出图。我的排查顺序是:
- 确认 JMeter 是否在运行。没跑压测的时候,后端监听器不会产生数据,面板自然空白。
- 确认 InfluxDB 里有没有数据。用前面的 SELECT 查询验证。没数据就回头看第 3 步,有数据就直接去查 Grafana。
- 确认数据源配置对不对。URL 写错、数据库名写错,都是低级的硬伤。
- 确认 Grafana 面板的时间范围。面板默认显示最近 15 分钟的数据,如果你压测是半小时前跑的,切到"Last 6 hours"或者点刷新按钮。
- 确认模板的查询字段是否跟数据一致。比如模板配置的是
measurement名称,但你的数据是另一个名称。
5.2 InfluxDB 报错 no space left on device
这个是热词里出现频率很高的报错,遇到别慌,多半就是磁盘满了。InfluxDB 在写入数据前需要写 WAL(预写日志),磁盘空间不够时就会报这个错误。
排查方法:
- 用
df -h查看磁盘空间,重点看 InfluxDB 数据目录所在分区。 - 清理方式有两种:快速释放空间的直接清理旧数据,比如执行
DELETE FROM jmeter WHERE time < now() - 1h;或者彻底一点,停掉 influxd,删除 data 目录下的 WAL 或 TSM 文件,再重启。 - 根本解法是配置好保留策略,让超过保留时间的旧数据自动清理。如果你一直没用保留策略,压测数据日积月累,磁盘早晚会被吃满。
还有一个小坑:如果 InfluxDB 的 WAL 文件本身损坏了,重启时会一直卡在启动阶段,日志里反复刷 WAL 相关的错误,这时也需要清掉 data 目录里 wal 子目录的内容再启动。
5.3 JMeter 后置监听器无效,面板一直没有实时变化
这个问题经常出现在 JMeter 和 InfluxDB 之间的时间不同步的场景。Grafana 面板左上角显示的是浏览器时间,InfluxDB 数据写入用的是服务器时间,如果两个时间偏差太大,面板刷新时数据还没写入对应的区间,看起来就像"没数据"。
排查时看一下压测机和监控机的系统时间是否一致,不一致就同步一下时间。实际测试环境中,多个压测节点的时间校准过,面板上的曲线才会严丝合缝。
5.4 InfluxDB 连接被拒 / 写入失败
后端监听器日志里如果看到连接被拒、连接超时的报错,按两层排查:
- 先确认 influxd 服务进程是否还在运行,防火墙是否放行了 8086 端口。
- 再确认 influxdbUrl 是否拼写正确。特别是容器化部署的场景,如果 JMeter 在本地、InfluxDB 在容器里,URL 里的 IP 不能写 localhost,要写容器的宿主机 IP 或者 Docker 网络里的容器 IP。
有个小技巧:在 JMeter 能访问到 InfluxDB 的那台机器上,浏览器访问http://监控机IP:8086/ping,通了就说明网络层面没问题。
5.5 模板导入后报变量错误
新版 Grafana(比如 9.x、10.x)在导入老模板时会提示版本不兼容,有时候会出现变量没有默认值的报错。处理方式不复杂:进入仪表盘设置 → Variables,把变量的默认值配上,特别是数据源变量,确保它引用的是当前实际配置的数据源名称。
6. 基于这个平台的压测实战经验延伸
6.1 性能测试完整流程与实时监控的结合
很多同学在做 JMeter 性能测试时只关注"能不能跑出报告",忽略了一个重要观念:压测过程中实时数据比最后的报告更能说明问题。
举一个我自己的实际案例:有一次压测一个订单查询接口,脚本每秒钟发 100 个请求,聚合报告跑完后显示平均响应时间 120ms,看起来一切正常。但回放 Grafana 面板时发现,从测试第 80 秒开始响应时间就从 30ms 开始缓慢爬坡,到第 150 秒变成了 350ms。因为全程是平均值的平滑曲线,最终报告看起来差异不大,但实际上系统已经出现了明显的性能退化。
如果当时没有 Grafana 实时趋势图,这个问题根本发现不了,报告看起来合格,实际上系统存在严重的慢查询隐患。后来我把这个接口放到多次压测里验证趋势,最终定位到数据库索引失效的问题。
6.2 压测过程的"三看"技巧
实际压测中,我习惯盯着 Grafana 面板做三个维度的判断:
一看趋势:响应时间曲线是否平滑,有没有突然的毛刺或断崖。曲线不是平缓的,大概率是系统某层在做不稳定的事情,比如 GC 停顿、缓存击穿、连接池重建。
二看瓶颈:TPS 增长速率是否和线程数增长匹配。如果线程数翻倍但 TPS 没涨,别急着加压力,先看系统是不是已经到了处理上限。这时再去配合监控系统的 CPU、内存、磁盘 IO 面板查资源消耗。
三看异常拐点:错误率曲线一旦出现拐点,要立即看是哪个接口报错、错误码是什么。比如 500 报错激增,说明后端服务已经崩溃;超时错误增多,说明队列开始堆积了。这些信号通过实时监控能提前捕捉到,等压测跑完再分析,压力可能已经对生产环境造成了影响。
6.3 多台负载机分布式压测时的监控要点
如果你的压测规模比较大,JMeter 会采用分布式结构,一台控制机(Master)带多台负载机(Agent)。这时候有个细节需要留意:InfluxDB 后端监听器只需要配置在控制机的测试计划里,负载机上不需要单独配置。原因很简单,负载机把数据回传给控制机,由控制机统一上报给后端监听器。
但这也带来一个问题:数据采集的实时性可能受制于控制机和负载机之间的网络。如果负载机数量多,控制机回传压力大,可以考虑在每一台负载机上单独配置后端监听器,用不同的 application 名区分,这样 Grafana 面板还能对比不同负载机之间的性能差异。
6.4 压测平台与监控体系的关系
这套三件套方案是"业务压测视角"的监控,一定要和其他运维监控工具区分开。
比如网上经常能搜到 Prometheus + Grafana 的监控方案,多用于采集服务器 CPU、内存、磁盘、网络等系统级指标,或者配合 node-exporter 做系统告警。这些系统指标和 JMeter + InfluxDB 的压测监控之间,是一种很好的互补关系。压测过程中,业务层的 TPS、响应时间异常往往跟系统层的资源耗尽脱不开关系,两套监控对比着看,定位问题就快得多。
如果你已经搭了裸机或容器环境的监控平台,完全可以在同一个 Grafana 里把 InfluxDB 和 Prometheus 两个数据源都接入,业务压测指标和系统资源指标放到同一个看板里。这样压测一跑,上面是接口响应时间、吞吐量,下面就是集群的 CPU 和内存使用率,瓶颈到底出在应用层还是基础设施层,一眼就能看出来,排查效率至少翻一倍。
7. 写在最后的建议
搭建这套平台本身并不复杂,按这篇的步骤来,快的半小时左右就能跑通。但平台搭起来只是开始,真正的价值在于,后续每一次压测你都会养成"边压边看趋势"的习惯。
我个人实际操作中的体会是:有实时监控和没有实时监控,对压测结果的理解完全不一样。以前跑完压测,我看着聚合报告上的数字总觉得差点意思,现在整个压测过程变成了"操控台视角",系统什么状态、瓶颈在哪里、什么时候开始退化,这些信息都是一目了然的。
另外提醒一点,这套方案搭好后,别忘了在压测前把 Grafana 的时间范围选好,把面板测试一下,确认数据正常更新后再开始正式压测。不要等到压测跑到一半才发现仪表盘没配好,操作起来手忙脚乱。
这个平台后续还可以扩展的东西很多,比如配合告警规则在指标异常时自动提醒,或者把压测报告自动归档到其他存储。但那些都是锦上添花的事,先把基础链路跑通、把实时监控这个习惯养成,就足够让性能测试的质量上一个台阶了。