JMeter原生HTTP采样器无法测WebSocket,因其仅完成Upgrade握手即终止,不维持连接、不处理Ping/Pong、不接收服务端推送,导致“连接成功”实为静默失效;必须使用WebSocket Samplers插件(如1.2.10+版本)并正确建模长连接生命周期。

直接说结论:JMeter + WebSocket Samplers 插件是目前最成熟、可落地的万级 WebSocket 并发压测方案,但必须避开插件版本错配、线程模型误用、连接状态忽略这三大坑。
为什么不能用原生 JMeter HTTP 采样器测 WebSocket
原生 HTTP Sampler 只能发一次 Upgrade 请求,拿到 101 Switching Protocols 就算“成功”——但它根本不会维持连接,更不会处理 Ping/Pong 帧、接收服务端推送消息、或在连接断开后自动重连。你看到的“99% 连接成功”,实际可能是 10 秒后全部静默失效。真实场景中,服务端会基于 Ping 超时(比如 30 秒无响应)主动 close 连接,而原生采样器对此毫无感知。
- 错误现象:
View Results Tree显示响应码 200/101,但服务端日志里大量connection reset by peer或no ping received - 本质原因:HTTP 采样器没有 WebSocket 状态机,无法建模长连接生命周期
- 替代方案只有两类:用支持完整协议栈的插件(如
WebSocket Samplers by Peter Doornbosch),或自己写 Go/Python 客户端(适合定制化强、需精确控制帧时序的场景)
选哪个 WebSocket 插件?认准这个包名和安装方式
别去 Bitbucket 找老项目,那个仓库已归档多年。当前唯一持续维护、适配 JMeter 5.6+ 的插件是 WebSocket Samplers by Peter Doornbosch,Maven 坐标为 net.lightbody.bmp:jmeter-websocket-samplers:1.2.10+。
- 验证安装成功:重启 JMeter 后,在取样器列表中应出现六类组件,关键的是
WebSocket Open Connection、WebSocket Close Connection和WebSocket Single Write Sampler - 错误配置典型:把
WebSocket Open Connection放在循环内——这会导致每轮都新建连接,迅速耗尽端口和内存;正确做法是每个线程只开一次连接,后续消息复用 - 版本踩坑:
1.2.8在高并发下有Pong帧处理死锁问题;1.2.10已修复,必须用这个及以上版本
JMeter 单机压到 1 万连接前,先调这三个系统参数
不调就压,1000 连接都可能失败。JMeter 自身只是 Java 进程,真正卡住你的永远是操作系统层资源。
-
ulimit -n 100000:把文件描述符上限提到 10 万,否则java.io.IOException: Too many open files会在 1024 连接左右爆发 - 改
bin/jmeter脚本里的 JVM 参数:HEAP="-Xms4g -Xmx4g",堆内存低于 4G 时,1 万连接大概率触发频繁 GC,导致线程卡顿、心跳超时 - Linux 内核参数:
net.ipv4.ip_local_port_range="1024 65535"和net.ipv4.tcp_fin_timeout=30,前者扩端口池,后者加速TIME_WAIT回收,避免端口耗尽
分布式压测不是加机器就行,重点在连接分片逻辑
单机极限约 1.6 万连接(受端口+内存双重限制),想压到 5 万以上,必须分布式。但注意:不是让 5 台机器各压 1 万就完事——服务端若没做连接 ID 分片或路由一致性,广播消息会因重复投递引发雪崩。
- 客户端分片关键:用
__threadNum或自定义变量生成唯一userId,确保不同 JMeter 实例连接的用户 ID 不重叠,方便服务端做连接归属判断 - 服务端配合点:网关层需支持按连接 ID 哈希分发到后端节点,否则一个群聊消息可能被 5 个节点各自广播一遍,I/O 放大 5 倍
- 监控盲区:别只看 JMeter 的聚合报告,必须同时采集服务端的
netstat -an | grep :8080 | wc -l和cat /proc/$(pidof java)/status | grep "FDSize\|Threads",确认连接数真实落地
最常被跳过的一步是:压测脚本里没模拟真实心跳行为。很多团队只发业务消息,漏掉定期 Ping,结果服务端批量踢人。记住,WebSocket 连接不是“建完就稳了”,它是一条需要持续喂养的活链路。

















