
1. 为什么性能测试到第14篇才聊插件和服务器监控做过几轮完整压测的人都清楚一个事实JMeter 本身能跑通一个脚本和能把一次压测做扎实中间隔着一大截。前面十几篇里陆陆续续把线程组、断言、参数化、结果树这些东西拆完了脚本能跑、报告能出看起来任务完成了。但真正上到预发或者生产环境压一轮问题就冒出来了——响应时间曲线一切正常服务器 CPU 已经打满可 JMeter 这边的汇总报告完全看不出来数据库连接池爆了应用日志里全是超时报错压测报告却因为断言写得太松直接放行。这类脚本层面没问题、系统层面炸了的情况十个压测项目里至少撞上七八个。所以这一篇不再纠结单个组件的用法而是把视角往上抬一层聊两个决定压测质量上限的东西一是常用插件二是服务器资源监控。插件解决的是JMeter 原生能力不够的问题比如原生线程组做不出阶梯式加压、原生监听器画不出像样的趋势图、原生断言处理不了复杂逻辑服务器监控解决的是只看客户端视角会误判的问题压测机观察到的响应时间只是请求往返的一小段真正的瓶颈往往藏在被测服务器的 CPU、内存、磁盘 IO、网络和 JVM 里。把这两块补上压测报告才从能看变成敢拿给团队看。不管你是刚装完 JMeter、还在照着教程点按钮的新手还是已经能独立写 BeanShell 断言、做数据库参数化取值的老手这篇都值得过一遍。新手能拿到一条从插件安装到监控看板的完整路径老手可以直接跳到插件选型对比和 Prometheus 那几段看看有没有漏掉的细节。下面所有操作都是我在实际项目里反复跑过、踩过坑之后沉淀下来的参数和目录结构尽量给到能直接照抄的程度不玩虚的。2. 插件体系的整体设计思路与选型逻辑2.1 原生 JMeter 的能力边界在哪里先把预期摆正JMeter 原生功能并不是弱它只是偏保守。核心的 HTTP 采样器、线程组、断言、监听器都在日常接口压测完全够用。它真正欠缺的是三类东西第一类是加压策略的灵活性原生线程组只能设置固定线程数、固定 Ramp-Up 时间想要每 30 秒加 20 个线程加到 200 稳住 5 分钟再退这种阶梯场景靠原生配置基本做不出来第二类是可视化能力原生的聚合报告、查看结果树一个是纯表格一个是纯文本压测过程中想实时看吞吐量曲线的走势原生给不了第三类是外围集成比如从消息队列取数据、对接监控平台、生成更专业的 HTML 报告这些都需要额外扩展。插件本质上就是社区把这些缺口补齐的产物。它们遵循 JMeter 的扩展规范编译成 jar 包丢进lib/ext目录重启后就能像原生组件一样在界面上使用。理解了这一点选插件就有了判断标准——这个插件是不是在补上面三类缺口之一如果不是那它大概率是可选项装多了只会拖慢 JMeter 启动、增加版本冲突风险。2.2 插件管理器的安装与依赖梳理手动往lib/ext里丢 jar 包是上古做法现在统一走Plugins Manager。它本身也是一个 jar下载下来放进lib/ext重启 JMeter菜单栏的选项下面会多出一个Plugins Manager入口。之后的插件安装、升级、卸载全在这个界面里点它会自动处理依赖关系和版本匹配避免你装了一个插件结果因为缺依赖跑不起来。安装路径需要留意两点。一是 JMeter 的安装目录不要带空格和中文D:\tools\jmeter这种就挺好D:\我的工具\性能测试\jmeter这种在某些插件加载时会出问题路径解析异常二是插件管理器本身有版本和你的 JMeter 大版本要对上JMeter 5.x 用对应版本的插件管理器跨大版本混用会出现界面能打开但插件装完不生效的情况。安装完先别急着装一堆插件先在插件管理器里点一下Available Plugins确认列表能正常拉取这一步通了再往下走。注意公司内网环境如果拉不到插件列表多半是网络策略问题可以让运维把插件源地址加进白名单或者在有外网的机器上把插件 jar 包下好再拷进lib/ext手动离线安装。2.3 常用插件清单与各自解决的问题插件市场里几十上百个组件真正高频用到的其实就那么几个。我按解决什么问题来分类比按字母顺序罗列实用得多。插件名称解决的核心问题典型使用场景优先级Custom Thread Groups提供阶梯、波浪、到达率等高级加压模型模拟真实用户逐步涌入高3 Basic Graphs提供吞吐量、响应时间、活跃线程数实时曲线压测过程实时观察趋势高PerfMon (Servers Performance Monitoring)采集被测服务器 CPU、内存、磁盘、网络指标客户端与服务端数据对齐高JSON/YAML/XML 相关提取器处理复杂响应结构的参数提取接口关联、链路压测中Dummy Sampler生成可控的假响应调试脚本逻辑脚本搭建阶段自测中MQTT / Kafka 相关插件压测消息队列类中间件物联网、异步消息场景按需选插件的原则很直接优先装能改变加压模型和监控能力的其次装能提升脚本编写效率的。前两类直接决定压测结论的可信度后一类只是让你的工作轻松一点。像 Dummy Sampler 这种脚本调试阶段很香但正式压测时用不上属于用完可以卸的类型。2.4 插件版本与 JMeter 大版本的匹配陷阱这是新手最容易栽的地方。插件和 JMeter 之间存在版本耦合某个插件在 5.3 上跑得好好的升到 5.6 可能就报ClassNotFoundException或者界面元素直接消失。原因在于 JMeter 内部 API 偶有调整插件如果没跟着更新就会失配。我的习惯是每个 JMeter 大版本对应一套固定插件版本记录在项目文档里不要看到插件管理器提示有新版本就随手升级。压测环境讲的是稳定可复现不是追新。升级前先在测试环境跑一遍基准脚本确认插件加载正常、报告结果一致再动正式环境。踩过一次坑——某次手贱全量升级插件结果 Custom Thread Groups 的界面渲染崩了线程组配置打不开排查了半天才发现是插件版本和 JMeter 不匹配回退版本才恢复。3. 核心插件实操与服务器监控落地要点3.1 Custom Thread Groups 阶梯加压配置详解原生线程组的痛点是加压过程生硬一上来就是全部线程同时启动对被测系统是突然袭击很容易触发限流或者直接把服务打挂压出来的数据也不真实。Custom Thread Groups 提供的Stepping Thread Group和Concurrency Thread Group就是为了解决这个。以 Stepping Thread Group 为例配置项拆开看其实就几个关键参数This group will start总线程数比如 200First, wait for启动前的等待时间通常设 0Then start第一批启动的线程数比如 20Next, add每轮新增线程数比如 20Threads every每轮之间的间隔比如 30 秒Using ramp-up新增线程的爬坡时间比如 10 秒Then hold load for达到峰值后保持多久比如 300 秒Finally, stop结束时如何退线程一般选 10 秒内全部停止这套配置翻译成人话就是从 20 个线程起每隔 30 秒加 20 个加到 200 为止峰值稳住 5 分钟然后收尾。真实的电商大促流量就是这个形态——逐步爬升、维持高峰、回落到常态。用这个模型压出来的 TPS 曲线才有参考价值能看出系统在哪个并发区间开始劣化。实操心得Ramp-Up 时间不要设成 0哪怕每个新批次只有 20 个线程也给它 5 到 10 秒的爬坡期。原因是线程启动本身有开销瞬时全部启动会在客户端制造毛刺把本该属于服务端的压力表现混进压测机自身的抖动里污染数据。3.2 实时监控面板3 Basic Graphs 的读图技巧压测过程中最忌讳的是蒙着眼睛跑——跑完才看报告。3 Basic Graphs 插件提供三张实时图Transactions per Second吞吐量、Response Times Over Time响应时间趋势、Active Threads Over Time活跃线程数。这三张图摆在一起看能帮你判断压测是否健康。健康的形态是吞吐量随线程数上升而上升到某个点开始放缓甚至走平响应时间在线程数上升初期基本平稳逼近瓶颈时开始抬头活跃线程数按你设计的阶梯整齐攀升。一旦出现线程数还在涨吞吐量不涨反跌响应时间陡然拉升基本可以判定系统已经进入瓶颈再往上加压只会制造更多超时数据失去意义。读图有个小技巧把三张图的时间轴对齐着看。如果响应时间抬头的时刻恰好对应线程数刚跨过某个阈值那这个阈值就是系统当前的并发容量参考点。这个点在容量规划里非常值钱比单纯的最大 TPS 是多少更有指导意义因为它告诉你能安全支撑多少并发。3.3 PerfMon 插件采集服务器资源的方法PerfMon 分两部分服务端跑一个ServerAgent客户端装 PerfMon 监听器。ServerAgent 是个独立的 Java 程序丢到被测服务器上启动即可它默认监听 4444 端口负责采集并回传指标。客户端这边在 JMeter 里加一个 PerfMon Metrics Collector 监听器配置好服务器 IP、端口和要采集的指标压测时就会同步记录。ServerAgent 支持的指标分几大类CPU用户态、系统态、空闲、等待、内存物理内存、交换分区、磁盘 IO读写速率、队列长度、网络收发字节数。采集粒度默认 1 秒一次可以调但不要调得太密否则采样本身会消耗被测服务器的资源变成监控影响被测对象的尴尬局面。配置时容易踩的坑有两个。一个是防火墙ServerAgent 的 4444 端口要在服务端放行否则客户端一直连不上监听器图标是灰色的另一个是权限某些系统下 ServerAgent 采集磁盘和网络指标需要更高权限用普通用户跑会拿到空值或者 0看起来像服务器完全没负载其实是采不到数据。这两个问题都不难解决但不知道的话能卡半天。注意ServerAgent 和 JMeter 的 JMX 采集是两回事。ServerAgent 采的是操作系统层面的指标JVM 内部指标堆内存、GC 次数、线程数需要通过 JMX 单独开启。做 Java 应用压测时两个都要上缺一个都看不全。3.4 插件安装目录结构与生效验证装完插件一定要验证是否真的生效别想当然。验证方法很简单重启 JMeter新建一个测试计划看右键菜单里能不能找到对应组件。找不到说明 jar 没加载成功。JMeter 的插件相关目录主要有三个lib/ext存放插件核心 jar 和 JMeter 扩展组件绝大多数插件装这里lib存放插件依赖的第三方类库插件管理器会自动往里放bin存放启动脚本和配置文件一般不动手动排查加载失败时先看jmeter.log日志里会明确写出哪个 jar 加载失败、报了什么错。常见错误无非是版本不匹配、依赖缺失、jar 损坏三种。插件管理器安装的大概率没问题手动拷进去的要特别留意。4. 完整压测实操流程与监控数据对齐4.1 从零搭建一个带监控的压测计划把前面讲的东西串起来走一遍完整流程。假设要压一个订单查询接口目标并发 200想看服务端资源消耗。第一步装插件。通过 Plugins Manager 装 Custom Thread Groups、3 Basic Graphs、PerfMon 三个重启生效。第二步起 ServerAgent。把它上传到被测服务器解压后执行启动命令看到它打印出Started之类的字样说明端口已经在监听。第三步建测试计划。加 HTTP 请求默认值配置服务器地址和端口加 HTTP 采样器配置接口路径和参数参数化的部分如果用 CSV 就加 CSV Data Set Config。第四步换加阶梯线程组按 3.1 的参数配好加压曲线。第五步加监听器把 PerfMon Metrics Collector 和三个实时图拉进来PerfMon 里填服务器 IP、4444 端口勾选 CPU、Memory、Disk IO。第六步跑。跑的过程中盯着实时图和服务端资源图看两条曲线叠在一起很容易看出转折点。等压测结束PerfMon 采集的数据会存进结果文件可以用它的图表工具离线画图或者导出 CSV 做进一步分析。4.2 参数化取值与数据库取数的注意点压测脚本里参数化是绕不开的尤其是需要真实用户数据的场景。常用的有三种方式CSV 文件、数据库查询、函数生成。CSV 最简单一个文件一列数据CSV Data Set Config 引用即可数据库方式需要加 JDBC Connection Configuration 和 JDBC Request从库里捞数据存进变量再用${变量名}引用。数据库取数有两个坑要提前说。一是连接池配置JMeter 里的 JDBC 连接池参数别设太小压测线程多的时候如果池子不够采样器会卡在等待连接上报出一堆莫名其妙的超时其实是脚本自身的问题不是服务端的问题。二是密码和字符集数据库连接串里的字符集要和库一致密码里如果有特殊字符要正确转义不然连不上库脚本直接挂掉。还有个更隐蔽的问题如果每个线程都要从数据库取一次数据而数据库连接又没做好复用压测本身会对数据库造成额外压力污染被测结果。正确的做法是尽量在脚本初始化阶段一次性把数据捞进内存压测过程中只做内存读取避免把压测机的数据库访问混进被测系统的负载里。实操心得用 CSV 参数化时文件里预留足够的数据行数行数少于线程循环次数会导致数据被重复读取。JMeter 在文件读完后的行为取决于 Recycle on EOF 的设置默认是循环重用如果不希望重复把它关掉并让线程在数据耗尽时停止。4.3 客户端与服务端数据的对齐分析压测最核心的分析动作是把客户端和服务端两边的数据对起来看。JMeter 这边给你响应时间和 TPSPerfMon 那边给服务端的资源曲线两相对照才能定位瓶颈在哪。举个常见的对照关系响应时间上升同时服务端 CPU 打满 → 大概率是计算密集型瓶颈代码里有热点响应时间上升CPU 不高磁盘 IO 队列变长 → 大概率是磁盘瓶颈日志写入或数据落盘拖累响应时间上升CPU 和磁盘都正常但网络发送字节数飙升 → 可能是响应体太大或者网络带宽成了瓶颈TPS 上不去服务端各项资源都很闲 → 检查网络链路、中间件连接池、下游依赖瓶颈可能在压测机到服务端之间或者在某个被忽略的下游服务这套对照逻辑是我做压测复盘时用得最多的基本上看一眼资源图就能缩小排查范围。关键是资源指标要和压测阶段对齐——比如你 10 点整开始加压资源图在 10 点 05 分才出现异常那这个异常就要和你当时的线程数阶段对得上不能错位解读。4.4 压测结果报告与数据导出压测跑完结果文件默认是 JTL 格式。这个文件可以用聚合报告打开看汇总但更好的做法是用命令行模式生成 HTML 报告图表更专业分享给团队也更直观。生成命令大致是这样jmeter -g result.jtl -o ./report_output-g指定结果文件-o指定输出目录目录必须为空否则会报错。生成的报告里包含 TPS 曲线、响应时间分布、百分位统计、错误率等比界面上的聚合报告详细得多。如果只想要原始数据做二次分析可以把 JTL 导成 CSV。查看结果树里的数据也能导出但要注意大数据量情况下别开着查看结果树跑压测它会把所有响应都存进内存几万个请求下来能把 JMeter 自己拖死。正式压测时监听器只留必要的查看结果树、查看结果树里的响应数据这类耗内存的组件能关就关。5. 常见问题与排查技巧实录5.1 插件装了不生效怎么办这是反馈最多的问题按顺序排查基本都能解决。首先重启 JMeter插件加载发生在启动阶段不重启不生效。其次看jmeter.log加载失败的 jar 会留明确记录。第三检查版本匹配插件版本和 JMeter 大版本是否对应。第四确认目录放对核心 jar 在lib/ext依赖在lib。第五排除路径问题JMeter 目录别带中文和空格。还有一种情况是看起来生效了但功能异常比如界面出来了但一保存就报错。这多半是插件和 JMeter 之间存在 API 差异插件没有完全适配当前版本。解决办法是找该插件对应 JMeter 版本的发行版别硬用。5.2 ServerAgent 连不上的排查路径ServerAgent 连不上表现是 PerfMon 监听器一直没数据、图标灰色。排查顺序先确认 ServerAgent 进程真的在跑再确认 4444 端口在服务端处于监听状态然后从客户端用 telnet 试一下端口通不通最后检查防火墙规则。这四步走下来90% 的连不上问题都能定位。如果是能连上但某些指标是 0那就是权限问题。磁盘 IO 和网络指标在某些系统下需要较高权限才能读取换用有足够权限的账户启动 ServerAgent 即可。这个坑很隐蔽因为 CPU 和内存采集是正常的容易让人误以为一切正常结果磁盘曲线一直贴地。5.3 压测机自身成为瓶颈的判断压测机资源不够是很典型的隐蔽问题。表现是怎么加压服务端的 TPS 都上不去响应时间还越来越长但服务端资源看着很闲。这时候要回头看看压测机自己的 CPU、内存、网络。JMeter 是偏重量级的压测工具线程数上了几百加上各种监听器压测机可能先扛不住。判断方法在压测机上装个监控工具甚至就是任务管理器看压测过程中压测机的 CPU 和网络使用率。如果压测机 CPU 长期 90% 以上或者网络出口带宽跑满那瓶颈很可能在压测机这边。解决办法要么用分布式压测master 加多台 slave 分担压力要么优化脚本减少不必要的监听器和断言开销把压测机的资源留给真正发请求这件事。5.4 BeanShell 断言的性能陷阱BeanShell 断言很灵活能写任意逻辑但它是解释执行的性能开销不小。在几百上千线程的高并发压测里每个请求都跑一遍 BeanShellJMeter 自己的 CPU 会被吃掉一大块。写断言时优先用原生断言响应断言、JSON 断言非要用脚本逻辑再考虑 JSH 或者 GroovyGroovy 的性能比 BeanShell 好不少语法也更现代。如果确实必须用 BeanShell尽量把逻辑写简单别在里面做复杂字符串处理或者调外部接口。还有个技巧是把部分校验逻辑前移到采样器本身用正则提取器先把关键字段提取出来再在断言里做简单比较别在断言里做提取。5.5 问题速查表现象可能原因排查方向插件界面找不到组件jar 未加载或版本不匹配查 jmeter.log核对版本ServerAgent 图标灰色端口不通或进程未启动telnet 4444查防火墙部分服务器指标为 0采集权限不足提权启动 ServerAgent服务端资源闲但 TPS 上不去压测机瓶颈或下游阻塞查压测机资源排查依赖服务响应时间高但 CPU 不高磁盘或网络瓶颈看磁盘 IO、网络发送量压测结果文件异常大监听器存了太多响应数据关闭查看结果树等重组件数据库参数化超时连接池配置过小调大 JDBC 连接池BeanShell 断言拖慢压测脚本解释执行开销换 Groovy 或原生断言5.6 几个我踩过的坑说几个不太常见但很耗时间的坑。第一个是HTTPS 证书压测 HTTPS 接口时如果服务端用了自签证书JMeter 默认会校验失败。解决办法是在jmeter.properties里配置信任所有证书或者把证书导入 JMeter 的 truststore。这个不配的话所有请求都会报 SSL 相关错误看起来像是接口挂了其实是客户端不信任服务端。第二个是录制脚本的过滤用录制功能抓 HTTPS 流量时浏览器里一大堆静态资源请求会混进来必须配好 URL 过滤规则只保留目标接口。不过滤的话脚本里几百个采样器真正要压的接口就一两个其他全是噪音。第三个是上传文件场景压测文件上传接口要注意勾选对 POST 使用 multipart/form-data并且正确配置文件参数MIME 类型也要对否则服务端收到的是空文件或者直接拒绝。Excel 上传和图片上传的 MIME 还不一样。第四个是结果树的导出有人压测完想从结果树里导出数据来分析大数据量下这个操作会非常慢甚至卡死正确做法是从 JTL 文件直接处理或者在命令行模式用工具转换别在界面里点导出。6. 关于这套组合我自己的一些体会插件和服务器监控这两块说白了是把 JMeter 从一个发请求的工具变成能出结论的测试平台的关键。我见过太多人脚本写得很漂亮参数化、断言样样齐全但报告拿出来没人信问题就出在只看客户端数据、没有任何服务端资源佐证。加上 PerfMon 之后报告里能同时给出200 并发下 TPS 是这些、此时服务端 CPU 是这些、磁盘队列是这些这样的数据才经得起追问。一个我个人觉得比较实用的习惯每次正式压测前先跑一轮低并发比如目标值的 10%做基线把服务端各项指标的正常区间记下来。正式压测时如果某个资源指标明显偏出基线范围就说明这个指标可能在往瓶颈方向走哪怕响应时间当时还没抬头也能提前预警。这个小动作花不了几分钟但对定位问题的帮助很大。插件别贪多前面说的三类缺口对应的插件装齐就够了。装得越多启动越慢版本冲突的风险越大而且在团队协作时每个人的 JMeter 环境越不一致复现问题就越难。把插件版本固定下来写进项目文档新同事接手时按文档装一遍环境就对齐了。这个习惯看起来不起眼但能省掉大量我这里跑得好好的你装了什么插件的扯皮时间。至于后续还能怎么扩展如果团队已经有 Prometheus 这类监控平台其实可以不完全依赖 PerfMon直接在压测时用平台的看板看服务端指标数据维度还更丰富。JMeter 负责产生压力监控平台负责观察两边按时间轴对齐看效果一样好甚至更好。这套思路在容器化环境里尤其顺手因为容器里的指标本身就通过 standard exporter 暴露出来采集成本比在每台机器上跑 ServerAgent 低得多。