资讯动态

JMeter服务器监控:PerfMon+ServerAgent配置与指标解读

发布时间:2026/10/20 9:40:05 来源:尧图企业网站定制
做性能测试的同行应该都有过这种经历压测脚本跑得飞起TPS、响应时间的曲线也拉出来了可当研发问一句“刚才那波压力下服务器CPU多少、内存稳不稳、磁盘IO是不是打满了”你只能对着空白的资源数据干瞪眼。JMeter本身是个纯粹的“施压方”它只负责发请求、收响应至于被压的系统内部状态它一概不知。想要把请求压力和服务器的真实运行情况对应起来就得靠JMeter服务器监控组件来补上这块短板。这篇文章我就把这个组件的来龙去脉、落地配置、指标解读和常见坑一次性讲清楚。内容适合刚接触性能测试没多久、正在研究怎么把资源监控接到JMeter里的新手也适合已经装了组件但对数据不知道怎么看的进阶同学。我尽量少讲虚的多放能直接上手的操作和判断思路。1. 内容整体设计与思路拆解1.1 为什么原生JMeter管不到服务器资源先捋一个基础问题JMeter跑完压测能给你什么数据响应时间、每秒请求数、错误率、请求字节数——这些全部是“客户端视角”的观察结果。也就是说JMeter站在“门外”拿秒表记录每个请求花了多久但门里面的服务器是CPU在忙、内存吃紧还是磁盘在排队它完全看不到。这就像开车只盯着仪表盘上的车速和转速却不知道轮胎是不是已经没气了。车速上不去、转速还狂涨如果不看轮胎状态你很难判断问题是出在发动机还是出在底盘。压测也一样响应时间慢可能是应用代码效率低也可能是服务器CPU早被打满了请求全在排队两者排查方向完全不同。没有资源监控数据你只能靠猜。JMeter原生监听器里其实有几个“暗示性”的选项比如“Connect Time”“Latency”它们能从网络往返角度间接反映链路质量但依然拿不到操作系统层面的指标。这也是后面所有监控组件要解决的核心问题把JMeter的采样数据和被测服务器的CPU、内存、磁盘、网络这些OS级指标在同一个时间坐标系里拼在一起。1.2 补上监控环节后性能测试才真正闭环引入服务器监控组件后性能测试的流程才算完整。正常情况下应该是压测工具施压同时被测服务器上的监控代理采集资源数据再把数据回传给压测工具展示测试结束后你能拿到一张图图上既有TPS曲线又有CPU、内存曲线时间轴对齐一眼就能看出“是不是在这个并发数下CPU到达瓶颈响应时间开始失控”。有了这套数据调优的逻辑就清晰了。比如一个查询接口并发从50涨到200响应时间从120ms涨到2s。如果此时CPU达到95%以上那就是计算资源不够考虑扩容或优化算法如果CPU才30%但磁盘读写时间高到可怕那就往存储层和SQL上查。没有监控数据这一切判断都无从谈起。这里提醒一下监控组件本身也是要占用资源的。它通常是一个轻量级Agent进程跑在被测服务器上定期采样系统指标。正常情况下它占用的CPU和内存很小但如果你在低配服务器上开一大堆采样指标、把采集间隔缩到100毫秒它自己也能成为一个干扰源。后面讲配置的时候我会再强调这个分寸。1.3 项目落地前需要理清的三个设计取舍在我的实际项目里每次引入监控方案前都要先做三个决策想清楚能避免后面不少折腾。第一监控粒度要粗还是细。只是想看个大概CPU、内存、磁盘、网络四大项就够了如果已经定位到一个可疑进程比如JVM内存一直在涨那就得再加JVM级别的监控比如堆内存、GC次数、线程数。颗粒度越细配置越复杂数据也越难收敛成结论。建议第一轮压测先拿粗粒度数据缩小范围再针对可疑点上细粒度监控。第二实时看还是事后分析。如果压测现场需要盯着曲线做并发梯度调整那就选能把数据画在JMeter界面里的组件而且监控服务器要和运行JMeter的机器网络连通如果是跑完再统一分析那后台记录数据、事后出图更合适界面展示反而是次要的。第三单机还是多机。被测系统是单台应用服务器还是前面挂Nginx、后面挂一堆微服务节点的集群单机监控一套组件足够集群环境就要考虑多Agent部署以及数据汇聚方案。我见过不少团队组件装了但只监控了其中一台机器压测过程中别的服务器都烧到报警了监控曲线还一片平静最终结论完全失真。这些取舍没有标准答案取决于你的测试目的和现有环境但动手装组件之前过一遍能少走几条弯路。2. 监控方案选型PerfMon之外还有哪些路子2.1 主流方案对比谁适合什么场景JMeter服务器监控的插件方案最常用的是JMeterPlugins里的PerfMon Metrics Collector配合部署在被测服务器上的ServerAgent。除此之外还有JMX远程监控、系统自带的性能监控命令、以及把数据接入时序数据库再加仪表盘的重型方案。我先把常见选型整理成一个表方便对照方案数据来源监控范围上手难度典型场景ServerAgent PerfMon被测服务器上的Agent进程CPU、内存、磁盘、网络、Swap等OS指标低单机或少量服务器快速压测验证JMX / JConsole / JVisualVMJava应用暴露的JMX端口堆内存、GC、线程、类加载等JVM指标中Java应用内存泄漏、GC停顿排查nmon / sar / dstat系统自带命令或工具OS级指标文本或图表输出中事后分析轻量化临时监控JMeter Backend Listener InfluxDB GrafanaJMeter原生后端接口输出样本数据压测数据和自定义指标高分布式压测、长期监控、团队协作注意一个点PerfMon管的是“这台机器的资源情况”JMX管的是“这个Java进程的内部状态”它们不是替代关系而是互补关系。真到排查JVM内存溢出的阶段PerfMon只能告诉你“内存用光了”但为什么用光、是不是GC没回收掉得靠JMX层面去看堆内存和GC日志。2.2 PerfMon ServerAgent的运作原理这个组合的核心逻辑是“客户端插件采集 服务端代理上报”。被测服务器上跑一个ServerAgent进程它定时读取操作系统的CPU、内存、磁盘IO等数据然后通过TCP/UDP协议暴露给客户端JMeter侧安装PerfMon Metrics Collector监听器配置好Agent的IP和端口就会周期性地去拉这些数据画成实时的曲线图。用生活化的例子类比ServerAgent像装在服务器上的一排传感器PerfMon像仪表盘传感器把读数传到仪表盘上你盯着仪表盘就知道机器状态。这里有个细节ServerAgent负责测的是“服务器本机的资源”不是“JMeter所在机器的资源”。如果你把Agent装到自己的笔记本上那监控到的就是笔记本的CPU大概率不是你想要的对象。按协议设计ServerAgent默认会在4444端口提供数据。这个端口需要注意防火墙是否放行后面常见问题部分我会详细讲排查思路。2.3 为什么我默认推荐这个方案作为入门首选理由很直接安装成本低、配置直观、反馈及时。ServerAgent解压即用PerfMon插件在JMeter插件管理器里勾一下就行整个链路十五分钟内能跑通。跑起来以后你能在JMeter的监听器界面里实时看到CPU和内存曲线这种即时反馈对新人的价值特别大能帮你快速建立“并发数变化会引起服务器资源什么反应”的直觉。它当然也有局限。单靠PerfMon画出来的图数据只存在内存和结果文件里不方便做长时间的趋势分析和报警。所以我在介绍完这套基础方案之后会在最后讲一下怎么把数据接到InfluxDB和Grafana升级成能长期观察、多人共享的监控体系。但对大多数“跑一轮压测、定位一个瓶颈”的场景PerfMon这套已经完全够用。3. ServerAgent PerfMon 落地配置全程3.1 环境准备两边各需要装什么先说JMeter侧。PerfMon插件一般在JMeterPlugins标准插件集里如果你的JMeter装了Plugin Manager插件管理器可以直接在Available Plugins里搜“PerfMon (Servers Performance Monitoring)”选中后安装重启即可。安装完成后在添加监听器的时候能看到一个叫“jpgc - PerfMon Metrics Collector”的新选项这就说明插件生效了。再说被监控服务器侧。ServerAgent是一个独立程序需要部署在目标服务器上运行环境要求装了Java并配好了JAVA_HOME环境变量版本通常要求JDK 8以上。下载ServerAgent包之后Windows上解压直接跑startAgent.batLinux上要先给脚本加执行权限再运行chmod x startAgent.sh ./startAgent.sh启动成功后窗口或终端里会显示监听的端口默认是4444。这里有个容易被坑的细节ServerAgent默认同时监听TCP和UDP的4444端口如果你只想用TCP可以直接用带参数的命令关闭UDP比如./startAgent.sh --udp-port 0 --tcp-port 4444这么做的好处是减少UDP端口暴露面而且在某些网络环境下UDP不通会导致PerfMon连不上直接禁用UDP反而能避免这类问题。3.2 在JMeter测试计划里添加并配置监控环境准备好之后打开你的JMeter测试计划按这个顺序操作在测试计划根节点上右键添加一个线程组或者复用已有的线程组因为监控监听器不依赖线程组也可以单独存在。在“监听器”菜单里添加“jpgc - PerfMon Metrics Collector”。在PerfMon面板里找到“Add Row”按钮新增一个监控目标。填写被监控服务器的IP地址、端口4444。在“Metric type”下拉框里选择要监控的指标类型。设置采集间隔Interval默认是1000毫秒。配置界面里“Metric type”能选的类型不少新手看到一长串英文容易懵我挑最常用的几个说CPU、Memory、Disks、Network I/O、Swap。CPU类型里还分整体使用率和每核单独的使用率压测阶段默认选整体就好Disks里面能看到磁盘读写的速率和磁盘队列长度Network I/O就是网络上下行吞吐量。指标选得越少采集和展示越流畅我一般第一轮压测只选CPU、Memory、Disks三样看情况再补Network。“Label”字段可以自定义建议直接把监控指标和目标服务器的备注写进去比如“应用服务器CPU”“压测机内存”这样多台服务器、多个指标共用一张图的时候图例一多也不怕分不清。3.3 压测运行时监控数据的读取方式PerfMon有一个独立于压测主流程的开关默认情况下只要你启动了测试计划它就会开始采集并绘制曲线即使当前线程组里没有请求在跑监控线程也会一直工作。这个设计其实挺方便你可以在压测开始前就先启动监控跑个几十秒看服务器空闲基线再做压测这样能更清晰地看出压力下和空闲时资源数据的差距。运行结束后PerfMon监听器里可以切换不同的监控项查看曲线也可以通过查看日志把采样数据导出。需要注意的是PerfMon的曲线数据是一路持续记录的如果压测周期特别长比如一小时以上曲线会非常密集这时候建议把采集间隔调到5秒甚至10秒人眼看趋势足够了数据量也能小很多。3.4 一次完整的监控运行记录拿我最近做过的一个压测场景举例被测是一个模拟项目X的订单查询接口部署在一台4核8G的服务器上。我先开了ServerAgent确认端口通然后在JMeter里加了一个PerfMon选了CPU和Memory两个指标间隔2秒。线程组设置是阶梯加压从50并发出发每两分钟加50最高到150并发。跑起来之后前两分钟CPU稳定在20%左右内存慢慢从2G涨到2.6G响应时间一直保持在100ms附近到100并发以后CPU曲线一下子冲到70%以上响应的均值和出现少量网络超时最后50并发维持的阶段CPU已经到90%多内存还在涨我马上叫停。后面查日志确认这个接口是纯CPU密集型的并发一高线程上下文切换开销把CPU吃满了内存的持续上涨则暗示了可能有个一次性缓存逻辑在阶段性问题。整个过程中PerfMon的曲线和TPS曲线是对得上的定位瓶颈非常快。4. 监控指标不会看等于白监控4.1 CPU指标怎么读才对很多人拿到CPU曲线就看个“高不高”但CPU指标里藏着不少信息量。ServerAgent的CPU类型细看有整体使用率、每核使用率以及用户态、内核态占用等信息。用户态高说明业务计算代码在密集工作内核态高往往意味着系统调用频繁比如大量网络读写、锁竞争、磁盘操作。IO wait高则说明CPU大量时间在等磁盘完成操作这通常是存储瓶颈的信号。联合判断是重点。如果CPU整体使用率高、TPS也上不去基本可以断定是计算能力瓶颈如果CPU不高、TPS已经掉了那问题大概率不在计算上往下看内存、磁盘和网络。还有一个容易忽略的点多核机器上整体CPU 60%不代表每颗核都一样如果负载不均衡个别核打满同样会拖慢线程调度这时候Per CPU维度会看得更清楚。4.2 内存与Swap的配合判断内存指标不是只看“用了多少”更要看增长趋势。如果物理内存逐步攀升、压测结束后一段时间也不回落这往往是内存泄漏的早期信号要继续配合JVM层面的堆内存和GC数据确认。另一个经典组合是物理内存快耗尽、Swap曲线开始抬头。哪怕业务本身还能撑住系统一旦频繁换页性能会断崖式下跌因为Swap操作比内存访问慢几个数量级这时候你就知道为什么响应时间突然从300ms跳到3秒了。看Memory指标时顺手留意一下监控Agent自身的内存占用。如果被监控服务器内存本身紧张ServerAgent占的几百兆内存在总内存里的比例会比较大虽然不至于说它拖垮系统但确实会给数据分析带来一些干扰心里有数就行。4.3 磁盘IO和网络IO怎么联合起来看磁盘的指标重点看两块IO的读写速率、IO队列的长度。不要只看速率高不高要看等待IO的时间占比。速率高但服务端已经让请求在磁盘队列里排队了那IO压力已经不小IO队列一长CPU再空闲也没用所有读写都在排队响应时间肯定下不去。网络IO的读法正好反过来。如果上行、下行吞吐已经接近网卡的理论峰值同时CPU使用率不高、响应时间仍然偏高说明瓶颈在网络上要么是带宽被打满要么是丢包重传这种情况往带宽限制和网络链路质量查。如果网络吞吐量还有富余但响应时间仍然有波动那就去检查中间链路比如负载均衡、DNS解析这些环节。4.4 一个多指标联合分析的实战案例有一次压测一个文件上传接口跑着跑着响应时间急剧恶化TPS从300直接掉到80。我本来以为是应用代码有问题打开PerfMon发现CPU只有40%内存也正常但磁盘IO队列的值一路狂飙network吞吐也居高不下。顺着这个线索查下去发现上传文件走的是本地磁盘存储接口的落盘逻辑没有异步化压力一大磁盘队列瞬间积压。后来接上JMX一看线程池里的IO线程全在等待文件写入。问题根源不在应用计算逻辑而在磁盘存储架构。如果当时只盯着CPU和内存估计还得排查半天。这套“先看资源曲线缩小范围再往下钻”的方法是我日常压测定位问题的主干思路。PerfMon提供的是第一轮的筛选信息它画不出应用内部到底哪一行代码有问题但能把问题快速圈定到CPU、内存、磁盘、网络这四个维度之一后面再用代码日志、链路追踪去深挖效率会高很多。5. 常见问题与排查技巧实录5.1 4444端口连不上这个出现频率最高。PerfMon显示连接失败第一步先在JMeter所在的机器上确认到被测服务器的网络通不通用telnet是最快的telnet 被测服务器IP 4444能连通说明网络和防火墙没问题去检查ServerAgent进程是否在运行、是不是换了端口连不通再看具体报错。Telnet直接提示“Connection refused”一般是被测服务器上ServerAgent没启动或者监听的端口不对如果卡住不动然后提示超时那就多半是中间防火墙拦了TCP包或者两台机器根本不在同一个网络隔离段内。Linux上如果开着防火墙可以临时放行4444端口注意放行后要确保是面向JMeter所在网段firewall-cmd --add-port4444/tcp生产环境压测的时候如果你没有防火墙权限别硬撑直接联系值班的运维同事帮忙放通或者换成走内网监控通道。我自己就试过压测都开始了防火墙规则还没生效白跑了十分钟监控曲线一条也没有。5.2 PerfMon一直有数据但不刷新数值恒为零这种问题比连不上更隐蔽。首先看是否选了空指标如果Metric type选的是“CPU”但下面还有细分选项没选全有可能数据一直为0。其次检查采集间隔如果设成了很大的值比如600000毫秒那每10分钟才更新一次看起来就像“不刷新”其实只是太慢了。然后把JMeter安装目录下的jmeter.log日志翻出来搜PerfMon相关的关键字插件运行时的错误信息一般会直接写进日志里比在界面上瞎猜快得多。还有一个兼容性坑ServerAgent的版本和JMeter插件版本如果差别过大会出现连得上但数据拿不到的情况。花钱解决不了老老实实把两边都更新到最新再在插件管理界面里重新拉一遍版本依赖基本都能恢复正常。5.3 监控本身拖慢了压测结果我也遇到过PerfMon采集频率太高、导致JMeter界面渲染卡顿的情况。这不太可能是ServerAgent把你的被测服务器拖垮了更多是JMeter侧监听器接收数据太多、绘图跟不上。解决办法有两个调大采集间隔比如从默认的1000毫秒改成5000毫秒或者把PerfMon资源曲线和压测结果分开单独开一个测试计划只跑监控压测计划只跑业务请求最后在日志层面汇总数据。曲线图观察实时趋势用第一套最终压测数据归档用第二套很多团队实际操作都是这么做的。5.4 多台服务器如何统一监控被测系统有多台机器的时候在同一个PerfMon监听器里多配几行监控节点就行每行填一台机器的IP和端口指标类型可以各不相同。比如应用服务器看CPU和内存数据库服务器看磁盘IO和网络。多台机器的数据会画在同一张图里时间轴一致对比分析方便很多。要注意的是每台目标机器上都要部署并启动ServerAgent端口可以统一用4444也可以每台各用各的只要PerfMon填对就行。如果你需要监控的机器特别多到了十几二十台的规模那PerfMon这套的数据组织和长期保存就吃力了这时候建议直接走上最后说的InfluxDB方案数据统一进时序数据库画图交给GrafanaJMeter只负责发压。6. 进阶玩法把监控数据接到时序数据库6.1 为什么要升级到InfluxDB GrafanaPerfMon适合快速验证但它有个天生的短板数据不便于汇总和追溯。压测跑完监控数据只存在于JMeter监听器的内存或结果文件里换个机器、换个人想看都得把文件拷过去而且没法做按天的趋势对比、没法设告警。团队协作做大项目压测的时候效率很低。这时候可以把JMeter的即时监控数据推送给InfluxDB再用Grafana建立仪表盘。链路大概是JMeter的Backend Listener把实时数据推送到InfluxDBInfluxDB保存时序数据Grafana从InfluxDB拉数据画成各种Dashboard。你甚至可以把ServerAgent采集到的系统资源数据也单独推送到InfluxDB把业务侧TPS和资源侧CPU放在同一个时间轴上看那是真正的“一屏全览”。6.2 接入步骤概览首先准备好InfluxDB并创建好数据库或Bucket然后在JMeter的“添加监听器Backend Listener”中选InfluxDBBackendListenerClient填上InfluxDB地址、数据库名以及一个固定前缀即可。测试计划一启动JMeter就会按设定间隔把吞吐量、响应时间、错误数这些核心指标写入InfluxDBGrafana那边加一个InfluxDB数据源再把JMeter官方的Dashboard模板导入图表就自动出来了。这套配置大概半小时能搭完相比PerfMon的一次性曲线体验提升非常明显。资源数据如果想也进InfluxDB可以用采集器直接把操作系统指标推过去常见的比如Telegraf配置好inputs和outputs之后CPU、内存、磁盘数据也都会进入InfluxDBGrafana里选对应measurement拖个图就行。6.3 什么情况值得上这套方案我的建议是如果你的压测周期比较长或者会反复常态化执行比如每轮发版前都跑冒烟压测那就值得把InfluxDB和Grafana这套搭起来如果你只是偶尔调试某个接口、看个资源趋势用PerfMon已经够没必要为一个临时任务维护一套时序数据库服务。工具永远服务于目的别被花里胡哨的仪表盘绑架这是我一直以来的选型原则。我在实际跑压测时的习惯是先把PerfMon这套快速链路跑通把瓶颈方向摸清楚。真正需要低频、长期观察的系统再用InfluxDB和Grafana固化下来。压测结束之后我永远先打开CPU、内存和磁盘IO三条曲线再回头看TPS和响应时间。服务器监控组件说到底就是一面镜子照出系统在压力下的真实反应。工具本身不复杂复杂的是你要学会从曲线里读出系统哪里在受力、哪里在硬撑这比多记几个配置参数值钱得多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑