JMeter本身不内置服务器资源监控,要在压力测试中同步采集服务器性能靠三种方式,在.jmx 脚本中一般以独立线程组或监听器实现:
JMX 协议:直接远程采集Java应用服务器(如 Tomcat)的内部标准。
HTTP 状态页:请求Nginx、Apache提供的状态页面,用正则或JSON提取器分析。
PerfMon Server Agent:采集操作系统级标准(CPU、内存、磁盘、网络),适用于所有服务器。
二、根据JMX直连监控Tomcat:
1. 启用 Tomcat远程JMX
编辑Tomcat启动脚本(如 catalina.sh 或 catalina.bat),在首行添加JVM参数:
text
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote"
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.port=9999"
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
重启后,用JConsole连接 service:jmx:rmi:///jndi/rmi://<IP>:9999/jmxrmi 测试。
2. 在 JMeter中通过JMX采集
推荐使用JMeter Plugins中的 PerfMon Metrics Collector监听器。
安装 JMeter Plugins Manager,然后安装 “PerfMon (Servers Performance Monitoring)” 插件。
在线程组或测试计划中添加 jp@gc - PerfMon Metrics Collector。
添加一行:主机填写Tomcat服务器IP,端口 9999,协议选择 JMX。
点击 Metric 列的按钮,输入JMX连接串,可浏览所有MBean,选择需要监控的属性。
常用 Tomcat 性能标准及对应的 MBean 和属性:
堆内存使用情况
MBean:java.lang:type=Memory
属性:HeapMemoryUsage.used、HeapMemoryUsage.max
垃圾回收次数和时间
MBean:java.lang:type=GarbageCollector,name=*(如 PS Scavenge、PS MarkSweep)
属性:CollectionCount、CollectionTime
线程数
MBean:java.lang:type=Threading
属性:ThreadCount、DaemonThreadCount
进程 CPU 负载
MBean:java.lang:type=OperatingSystem
属性:ProcessCpuLoad(需要 Java 8 及以上)
Tomcat 总请求数和错误数
MBean:Catalina:type=GlobalRequestProcessor,name=*
属性:requestCount、errorCount
Tomcat 线程池使用状况
MBean:Catalina:type=ThreadPool,name=*
属性:currentThreadCount、currentThreadsBusy
也可以不用插件,在 JSR223 Sampler 中用Groovy直连JMX获取并记录这些值,灵活但需要编写代码。
三、通过HTTP状态页采集监控Nginx:
1. 开启Nginx stub_status模块
保证 Nginx 编译了 --with-http_stub_status_module,然后在配置中添加:
nginx
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1; # 根据 JMeter 所在 IP 调整
deny all;
}
访问后返回类似文本:
text
Active connections: 43
server accepts handled requests
1264 1264 3578
Reading: 0 Writing: 12 Waiting: 31
2. 在 JMeter 中分析并记录
创建一个独立监控线程组,循环请求此 URL,并用正则表达式提取标准。
添加 HTTP 请求取样器,目标URL为 /nginx_status。
添加正则表达式提取器,用来下方式一次性提取多个值:
Active connections:\s+(\d+)\s+[\s\S]*?\s+(\d+)\s+(\d+)\s+(\d+)\s+Reading:\s+(\d+)\s+Writing:\s+(\d+)\s+Waiting:\s+(\d+)
这样可得到变量:ActiveConnections、accepts、handled、requests、Reading、Writing、Waiting。
后续可用BeanShell或JSR223后置处理程序将这些值追加到文件,或者写入InfluxDB再配合Grafana绘图。
如果想直接在 JMeter 监听器中看到 Nginx 标准变化,需要结合外部工具(如 InfluxDB+Grafana),单纯JMeter自身没有内置曲线图表能展示自定义监控数据,但可通过 PerfMon Metrics Collector 配合自己开发的简单agent来中转。
四、通用系统资源监控:PerfMon Server Agent
对于 Tomcat 或 Nginx 所在机器的 CPU、内存、磁盘、网络,使用JMeter Plugins的Server Agent最方便。
在目的服务器下载并运行 ServerAgent(默认端口 4444)。
JMeter 中添加 jp@gc - PerfMon Metrics Collector,协议选 TCP,端口 4444,添加 CPU、Memory、Disk I/O 等标准即可。
这些标准会和 JMX 监控数据出现在同一张图表中,方便关联分析。
五、在.jmx脚本中
一个完整的性能测试计划一般包含三个部分:
工作负载线程组:模拟真实用户操作,包含业务请求。
监控线程组(独立运行,循环或按定时器间隔执行):
针对 Tomcat 的 PerfMon Metrics Collector(JMX 协议)。
针对 Nginx 的 HTTP 请求 + 正则提取器,并可将结果输出到外部存储。
针对系统资源的 PerfMon Metrics Collector(TCP 协议)。
setUp / tearDown 线程组:初始化和清理数据。
所有监控数据在测试过程中实时更新到监听器图表,测试完成后可导出CSV详细分析。
六、注意事项
JMX 安全:生产环境必须启用密码认证和 SSL,测试环境可以暂时关闭。
端口和防火墙:保证 JMX 端口(如 9999)、ServerAgent 端口(4444)、Nginx 状态端口已放通。
采集间隔:监控采样间隔建议 1~5 秒,太短会增加被测系统负担,干扰性能结果。
Nginx Plus版提供更丰富的JSON状态接口,此时可直接用HTTP请求 + JSON提取器,无需复杂的正则。