jmeter原生不支持websocket,必须通过插件扩展;正确安装需先装plugins manager插件,再通过其安装websocket samplers by peter doornbosch,手动复制jar包至lib/ext目录无效。

JMeter 本身不支持 WebSocket,必须靠插件;用错插件版本或漏传 JAR 包到压测平台(如 PTS、腾讯云可观测平台),脚本在本地能跑,线上直接报 ClassNotFoundException 或连接超时——这是最常踩的坑。
WebSocket Sampler 插件怎么装才不翻车
别信“下载一个 ZIP 解压就完事”的说法。实际要分两步走,且顺序不能错:
- 先装
jmeter-plugins-manager-x.x.jar(比如jmeter-plugins-manager-1.11.jar)到JMETER_HOME/lib/ext,重启 JMeter 后菜单栏出现Plugins Manager才算成功 - 再通过 Plugins Manager 搜索并安装
WebSocket Samplers by Peter Doornbosch—— 注意不是 “JMeter WebSocket Plugin” 或其他同名但作者不同的包 - 验证是否生效:右键
Test Plan→Add→Sampler,能看到至少六个以WebSocket开头的采样器(如WebSocket Open Connection、WebSocket Single Write Sampler)
如果只手动丢 JMeterWebSocketSamplers-1.2.10.jar 进 lib/ext 却没装插件管理器,JMeter 启动时不会报错,但采样器根本不会出现在菜单里。
ws 和 wss 配置差异不止改个 protocol
ws 和 wss 看似只差一个字母,但压测时配置错一点,连接就卡在握手阶段,日志里只显示 Connection refused 或 Timeout:
WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。
-
Protocol字段必须填ws或wss(大小写敏感,不能写成WS) -
Port Number要匹配协议:ws通常用80或8080,wss必须用443或服务端明确暴露的 TLS 端口(比如8443) -
wss场景下,必须额外配置 SSL:在Test Plan级别添加HTTP(S) Test Script Recorder或直接在 JVM 启动参数里加-Djavax.net.ssl.trustStore=xxx.jks;否则会抛javax.net.ssl.SSLHandshakeException - 若服务端要求双向认证(mTLS),还需把客户端证书放进
lib/ext并在WebSocket Open Connection的高级设置里勾选Use client certificate
为什么 WebSocket 脚本在本地通、上云就失败
PTS、腾讯云可观测平台等 SaaS 压测平台不自动携带你本地 lib/ext 下的插件 JAR,必须显式上传——漏传 JMeterWebSocketSamplers-*.jar 是线上失败的第一原因:
- 本地调试通过后,导出的
.jmx文件里只记录采样器配置,不打包插件逻辑 - 上传至 PTS 时,需同时上传:
脚本.jmx+JMeterWebSocketSamplers-1.2.10.jar(注意版本号)+ 若用了 proto 或自定义类,还要传chat-message.jar等依赖 - 阿里云 PTS 明确要求插件版本为
1.2.8才有完整埋点;用1.2.10可能导致聚合报告里看不到WebSocket Single Read Sampler的响应时间 - 腾讯云可观测平台对插件版本更敏感,
1.2.8以下可能直接加载失败,报java.lang.NoClassDefFoundError: org/apache/jmeter/protocol/websocket/sampler/WebSocketOpenConnection
连接复用和心跳怎么配才像真实用户
WebSocket 是长连接,但默认采样器每发一次 Write 就建一次连,这完全违背协议本质,压出来的 QPS 毫无参考价值:
- 必须用
WebSocket Open Connection建连(放在线程组初始化位置),再用WebSocket Single Write Sampler和WebSocket Single Read Sampler循环发送/接收,且勾选Use existing connection - 真实业务必有心跳,否则连接会被中间代理(如 Nginx、SLB)主动断开;在循环控制器里加
WebSocket Ping/Pong Sampler,间隔设为25000ms(略小于服务端ping_timeout) - 不要用
WebSocket request-response Sampler替代读写分离:它内部是同步阻塞模型,一次只能处理一问一答,无法模拟服务端主动推送(如行情更新、IM 消息) - 若需验证服务端推送内容,
WebSocket Single Read Sampler的Response Pattern填正则(如"type":"message"),避免因等待超时误判连接断开
真正难调的不是连上,而是让几百个线程各自维持稳定长连接并持续收发——超时值、重连策略、帧缓冲区大小这些参数,得结合服务端日志反复对齐,不能只看 JMeter 界面里的绿色对勾。










