Workerman压测不能直连JMeter因其不遵循RFC6455握手,需用socket客户端模拟;JMeter测WebSocket必须安装jmeter-websocket-samplers-1.2.8.jar及匹配Jetty依赖,否则采样器缺失或报错。

Workerman 压测不能靠 JMeter 直接连,得用 socket 客户端模拟;JMeter 测 WebSocket 必须装插件,且 1.2.8 版本是云压测唯一兼容的埋点版本。
Workerman 压测为什么不能直接用 JMeter
Workerman 是纯 PHP 的长连接服务,不走 HTTP 升级握手,也不暴露 WebSocket 协议层(比如 Upgrade: websocket 头)。JMeter 的 WebSocket 插件只认标准 RFC6455 握手流程,对 Workerman 的 raw TCP 或自定义协议握手会直接失败——常见错误是 Connection refused 或卡在 WebSocket Open Connection 超时。
真正有效的压测方式是绕过协议抽象,直连 socket:
- 用
stream_socket_client()或fsockopen()写 PHP 脚本,手动完成连接、登录、心跳、发消息全流程 - 用
wrk配 Lua 脚本(需启用--latency并禁用 HTTP 检查),但仅适用于简单 echo 场景 - 用
locust+ Python 的websockets库,适合带鉴权/JSON 协议的业务逻辑 - 避免用
ab:它只支持 HTTP,无法维持长连接,测出来的是“连接建立耗时”,不是真实 WebSocket 性能
JMeter 测 WebSocket 必须装对插件和依赖
官方 JMeter 不带 WebSocket 支持,插件选错或依赖缺失会导致采样器不显示、脚本运行时报 NoClassDefFoundError 或 java.lang.NoClassDefFoundError: org/eclipse/jetty/util/Attributes。
WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。
正确做法是:
- 下载
jmeter-websocket-samplers-1.2.8.jar(不是 1.0.x 或 2.x),放进JMETER_HOME/lib/ext/ - 额外补全 Jetty 依赖:至少要
jetty-io-9.4.53.v20231009.jar、jetty-util-9.4.53.v20231009.jar、websocket-client-9.4.53.v20231009.jar(版本必须严格匹配,否则握手失败) - 启动 JMeter 后,在线程组右键 → Add → Sampler → 看到
WebSocket Open Connection和WebSocket Request-Response Sampler才算成功 - 别用插件管理器自动装——它常装错分支版本,导致
WebSocket Sampler选项里没有Streaming Connection勾选框
WebSocket 压测中容易被忽略的三个关键配置
很多脚本跑起来“能连上、能收发”,但数据失真,问题就出在这三处:
-
Timeout > Connection:如果Connection Timeout设 3000ms,Response Timeout却设 100ms,那只要服务器响应稍慢,采样器就直接标为失败,吞吐量虚低 -
Streaming Connection未勾选:默认每次请求后断连,测出来的是“短连接性能”,不是真实 WebSocket 场景。高并发下频繁建连会压垮客户端机器,TIME_WAIT爆满 - 没配
Close Connection Pattern:服务器主动断连时,JMeter 不知道该关哪条连接,后续请求仍往已关闭的 socket 发,报java.io.IOException: Stream closed
真实业务中,心跳包、重连逻辑、连接池复用都得在 JMX 里显式建模,不能只靠一个 WebSocket Request-Response Sampler 走到底。

















