问题出现得很突然,日志倒是留得挺全。三台四核八 G 压测机做 JMeter 分布式压测,聚合报告里 TPS 在四千到九千之间来回跳,单看每台 slave 都正常,合并后的响应时间曲线是锯齿形。

刚开始盯着「脚本里塞了定时器和断言,客户端开销盖过了服务端」,折腾了半个多小时,排掉了。

这类报错背后常见的原因有几处,逐个排除就行。三台机器没做 NTP 同步,聚合时按时间戳归并对不齐。还有一种是slave 的 JVM 堆太小,压测中频繁 Full GC。

不容易想到的是,master 只负责汇总却也在跑线程组,自己成了负载。

第一件事是对齐三台机器的系统时间

chronyc sources -v && chronyc makestep

随后加大 slave 堆并全程命令行运行

export JVM_ARGS='-Xms4g -Xmx4g' && jmeter -n -t plan.jmx -R 10.0.0.11,10.0.0.12,10.0.0.13

压测中观察 GC 次数与停顿

jstat -gcutil $(pgrep -f ApacheJMeter) 1000 20

结果落到本地 jtl 再离线聚合

jmeter -n -t plan.jmx -l /data/jtl/run1.jtl

怎么算真的好了,看的是同一批现象。三台机器时间差收敛到一秒以内,聚合 TPS 曲线变成平稳直线,P99 的波动幅度不超过一成。

这里还有个坑。分布式压测最容易被忽略的是时钟,时间戳差几十秒,聚合出来的吞吐就是错的;开压前统一次强制对时,比调 JVM 参数划算。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189