JMeter分布式模式下活动线程数为负、执行卡住及请求统计异常咨询
JMeter分布式压测三类异常根因说明
测试部署基线
- 压测架构:1台master节点(负责下发压测指令、聚合全量测试结果)+2台slave节点(负责实际发起压测负载)
- 并发梯度配置:单台slave分别配置2k、2.5k、3k并发量级,对应总并发4k、5k、6k三个测试场景
- 已观测异常:
- 压测执行尾段卡在剩余20-30个活跃用户阶段无法正常结束,同时活动线程计数显示为负值
- 总并发5k场景下,生成的HTML测试报告中部分接口的请求统计量与实际发送量存在偏差
问题1:活动线程数显示为负值的触发条件
该异常属于JMeter分布式模式下的典型计数同步问题,触发需满足以下任一条件:
- 跨节点线程计数存在竞态缺陷:master端的活跃线程数是基于slave异步上报的线程启动/停止事件做加减计算,当slave因GC停顿、网络抖动出现线程停止事件上报乱序、重复上报或丢失时,master端计数器会出现多减,最终显示负值
- slave节点资源不足:单slave并发超过2k时,若JVM堆内存配置偏低,slave进程会频繁触发Full GC,GC停顿期间积压的线程状态事件批量上报时,计数逻辑无幂等校验,直接触发计数异常
- 脚本存在线程阻塞逻辑:若脚本配置了
tearDown Thread Group、或定时器/断言配置不当阻塞线程正常退出,slave上报的线程状态与master端预期时序错位,也会出现负值计数
问题2:压测执行卡住无法完成的根因
压测尾段卡住与线程计数负值属于同源问题,核心根因分三类:
- 存在阻塞的残留线程:高并发场景下,部分请求因服务端响应超时、TCP连接未正常释放,对应工作线程会阻塞在socket读取等待状态,既不会主动上报停止事件,也不会响应master下发的终止指令,master端等待所有线程上报停止信号的逻辑会持续阻塞,直到触发默认30分钟超时才会强制结束
- slave结果上报队列溢出:高负载下slave本地的异步结果上报队列如果配置过小,队列满后会直接丢弃部分线程停止事件、样本结果,master收不到对应线程的结束标记,会持续判定存在活跃线程,无法结束测试
- RMI通信链路异常:分布式压测默认通过RMI实现节点通信,当slave存在多网卡、防火墙临时丢包时,master与slave心跳中断后重连,会导致部分线程生命周期状态同步丢失,master端剩余活跃线程计数永远无法归零,测试流程卡住
问题3:HTML报告请求统计数与实际发送值不匹配的原因
统计值偏差本质是样本结果在传输、聚合环节出现丢失或重复计算,常见触发场景:
- 结果队列主动丢弃样本:slave节点的后端监听器、本地结果聚合队列在高负载下会默认丢弃超过队列阈值的样本数据,这部分样本不会上报到master,最终统计值自然低于实际发送量
- 接口标签动态变化:如果脚本中使用了动态拼接的接口名称(比如带时间戳、随机参数的endpoint),同一接口的请求会被拆分到不同统计条目下,看起来单条endpoint的统计量和预期不符
- 分布式结果同步异常:当master与slave网络抖动出现重传时,同一份样本可能被重复上报,或者部分slave的结果未被纳入聚合,都会导致统计值偏离实际值
- 测试过程被中断:如果测试中手动触发过停止、或slave节点出现过进程重启,中断前产生的部分样本不会被纳入最终报告统计,也会出现数值不匹配
内容的提问来源于stack exchange,提问作者Ankit Patel
相关产品推荐
相关产品推荐

