workerman压测需确保启用rfc6455握手与帧处理,使用websocket open connection和request-response sampler组合,配置streaming connection、唯一connection id及合理超时值,并注意云平台插件版本一致性。

Workerman 本身不内置 WebSocket 协议解析层,压测时必须确保后端已正确启用 WebSocketConnection 或基于 WebServer + onMessage 实现标准 RFC6455 握手与帧处理;否则 JMeter 的 WebSocket Sampler 会卡在连接阶段或收不到响应。
确认 Workerman 服务暴露的是标准 WebSocket 地址(ws:// 或 wss://)
Workerman 默认监听的是 raw TCP,不是 HTTP Upgrade 流程。压测前必须验证:
- 服务是否绑定了
WebServer并启用了onConnect/onMessage回调,且返回了正确的HTTP 101 Switching Protocols响应头 - 浏览器访问
ws://your-domain:2346/test能成功建立连接(可用 Chrome DevTools → Network → WS → Frames 查看收发帧) - 若用 Nginx 做反向代理,需显式透传
Upgrade和Connection头,否则 JMeter 连接会直接断开
常见错误现象:Connection refused、java.net.ConnectException、或 JMeter 日志中出现 Failed to open WebSocket connection —— 这基本说明握手没走通,不是压测问题,是服务未就绪。
使用 WebSocket Open Connection + WebSocket Request-Response Sampler 组合
JMeter WebSocket Samplers 插件(推荐 jmeter-websocket-samplers-1.2.10.jar)提供两个核心采样器,不能只用单个:
-
WebSocket Open Connection:负责发起握手、建立长连接,必须放在线程组最前面,且勾选Streaming Connection(否则每次请求都重连,无法模拟真实用户) -
WebSocket Request-Response Sampler:复用已建立的连接发送消息,填入Request data(如 JSON 字符串或 STOMP 帧),并设置Response Pattern(如"success":true或\u0000)来等待服务端响应 - 若 Workerman 集群使用 Redis 或 Gateway 分发消息,需确保
Response Pattern匹配的是最终业务响应,而非中间心跳或 ACK
注意:WebSocket Single Write Sampler 不带响应等待逻辑,不适合需要校验业务结果的压测场景。
WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。
集群压测关键参数:连接复用、线程隔离与路径随机化
Workerman 集群通常依赖客户端 ID 或 token 路由到特定 worker 进程,JMeter 必须模拟真实行为:
- 每个线程(虚拟用户)应使用唯一
Connection ID,可通过${__UUID()}或${__RandomString(8,abcdefghijklmnopqrstuvwxyz)}生成,并拼入 URL path(如/ws?uid=${uuid}) - 禁用
Use KeepAlive(该选项对 WebSocket 无效),改用插件自身的Streaming Connection控制连接生命周期 - 若集群有网关层做 session 粘滞(sticky session),需在 JMeter 的
HTTP Header Manager中添加Cookie或自定义 header(如X-Client-ID),否则请求可能被轮询打散,导致消息丢失或乱序 - 超时值建议设为:Connection Timeout = 5000ms,Response Timeout = 10000ms;过短易误判失败,过长拖慢整体吞吐
性能影响点:JMeter 默认每线程独占一个 TCP 连接,500 并发 ≈ 500 个 TCP 连接。Workerman 需配置足够 $worker->count 和 max_connection,否则连接会被拒绝。
本地调试通过后,上传 PTS 或自建分布式节点要注意插件一致性
阿里云 PTS、腾讯云压测平台等均要求显式上传插件 JAR 包,且版本必须匹配:
- 云平台埋点仅对
jmeter-websocket-samplers-1.2.8.jar或1.2.10.jar完整支持;用1.2.9可能导致监控数据缺失(如无WebSocket Response Time曲线) - 若脚本中引用了自定义 JSR223 断言或 BeanShell 处理二进制帧,需一并打包进 JMX 或上传对应 JAR 到平台 lib/ext
- Workerman 集群日志中若看到大量
connection reset by peer,优先检查 PTS 节点的 JMeter 版本(必须 ≥ 5.4)与插件是否完全一致,而非 Workerman 配置
真正容易被忽略的是:Workerman 的 onClose 回调是否被正确触发 —— JMeter 断开连接时若服务端没收到 FIN 包(比如被防火墙拦截),连接会残留,最终耗尽 ulimit -n。压测后务必检查 lsof -i :2346 | wc -l 是否回落到基线值。










