一、为什么传统 HTTP 采样器无法压测 WebSocket?
在实时监控看板、大屏实时遥测曲线、聊天通讯或实时协同编辑场景中,WebSocket 协议已全面取代了传统低效的 HTTP 频繁短轮询。
WebSocket 具有以下核心特征:
- 基于单一 TCP 连接的全双工通信:握手通过 HTTP 协议发起(携带
Upgrade: websocket请求头),一旦协议升级成功,通信即脱离 HTTP 语义,双向可同时自由收发数据; - 极低协议开销:每个数据帧的头部仅占用 2 到 10 字节,远小于携带海量 Header 的普通 HTTP 请求。
由于 Apache JMeter 原生只支持基于“一问一答”模型的短连接协议(HTTP/FTP/JDBC),无法处理长连接维持和异步消息推送。要对 WebSocket 进行压力测试,必须引入专用的插件体系。
二、插件选型与环境安装
目前业界最成熟稳定、也是 JMeter 社区事实标准的插件是 JMeter WebSocket Samplers(由 Peter Doornbosch 维护开发)。
安装方式:
- 打开 JMeter 的 Plugins Manager;
- 搜索
WebSocket Samplers by Peter Doornbosch并一键安装重启; - 重启后在 添加 -> 取样器 (Sampler) 下即可看到完整的 WebSocket 组件套件。
三、核心采样器职责与编排模型
该插件将 WebSocket 的生命周期细分为独立的原子采样器,支持像积木一样拼装复杂业务交互:
text
1. WebSocket Open Connection ──► 完成 101 Switching Protocols 握手建连
│
▼
2. Loop Controller 循环控制器
├── WebSocket Ping/Pong ──► 定时发送心跳保持会话防断开
├── WebSocket Single Write ──► 主动向服务端发送查询/指令
└── WebSocket Single Read ──► 阻塞等待并断言服务端推送的指标报文
│
▼
3. WebSocket Close Connection ──► 优雅断开连接并校验 Close 状态码1. WebSocket Open Connection(建连采样器)
- Server Name or IP:目标服务器地址;
- Port Number:WebSocket 端口(通常为
80或443); - Path:服务路由路径(如
/ws/metrics/stream); - Connection Timeout:建连超时时间(通常设为 5000ms)。
2. WebSocket Single Write Sampler(发送消息)
- Request data:向服务端发送的 JSON 或文本指令(例如订阅指定设备的波形流:
{"action": "subscribe", "deviceId": "${deviceId}"}); - 支持直接引用 JMeter 线程变量进行动态参数化。
3. WebSocket Single Read Sampler(读取并断言消息)
- Timeout (ms):等待服务端推送消息的最长等待窗口(如 3000ms);
- Response assertion:配合正则提取器或 JSON Extractor 提取推送数据中的业务字段并执行断言校验。
4. WebSocket Ping/Pong Sampler(保活心跳)
长连接服务通常设置了服务端空闲检测(如 30 秒无心跳自动踢下线)。在负载测试期间,应在循环中以固定间隔发送 Ping 帧,确保大量并发长连接保持在线状态。
四、模拟海量长连接的系统级调优
当单台 JMeter 施压机需要模拟数千至数万个并发长连接维持(Hold Connection)时,容易遇到客户端系统级瓶颈:
- 操作系统文件句柄数(File Descriptors): 每个 Socket 连接对应一个文件描述符。在压测机上必须调高上限:bash
ulimit -n 65535 - 本地动态端口范围调优:bash
# 扩大本地出站可用临时端口范围 sysctl -w net.ipv4.ip_local_port_range="1024 65535" - 关闭不必要的实时日志打印: 万级长连接持续运行会产生庞大的数据流,严禁在负载测试时启用“查看结果树(View Results Tree)”,仅保留聚合报告与后端监控统计。