前端直接发起websocket压测本质是绕过服务端调度,在浏览器或node.js中批量创建真实连接,可快速暴露客户端资源瓶颈、握手失败率及内存泄漏等问题;浏览器受限于并发连接数(chrome默认6个/域名),node.js则依赖系统文件描述符与内存,需合理调度避免阻塞和syn风暴。

前端直接发起 WebSocket 压力测试,本质是绕过服务端调度、在浏览器或 Node.js 环境中批量创建真实连接实例。它不替代后端监控,但能快速暴露客户端资源瓶颈(如 MaxConnectionsPerHost 限制)、握手失败率、内存泄漏和事件循环阻塞问题。
用浏览器控制台跑轻量并发连接(适合 50–300 连接)
这是最贴近真实用户环境的验证方式,无需安装任何工具,但受浏览器策略严格限制:
- Chrome/Edge 默认单域名最多 6 个并发连接(
chrome://flags/#max-connections-per-host可调,但不推荐生产级使用);Firefox 更严,实际并发常卡在 20–50 之间 - 每个
WebSocket实例占用独立 TCP 连接 + JS 堆内存,200+ 连接易触发RangeError: Maximum call stack size exceeded或页面无响应 - 必须手动管理
onopen/onerror/onclose,漏掉sockets.push(ws)或未绑定onerror会导致连接“静默丢失”,你以为建了 200 个,实际活跃可能只有 30 个
可执行的最小可行脚本:
const url = "wss://your-server.com/ws";
const sockets = [];
for (let i = 0; i console.log(`✅ ${i}`);
ws.onerror = e => console.warn(`❌ ${i}`, e);
ws.onclose = () => console.log(`? ${i} closed`);
sockets.push(ws);
}
// 防止被 GC 回收
window.sockets = sockets;
用 Node.js + ws 库模拟高并发(推荐 500+ 连接)
脱离浏览器沙箱后,并发上限取决于本机文件描述符(ulimit -n)和内存。关键不是“能建多少”,而是“建完能否稳定维持”:
- 务必使用
ws库(非websocket),前者支持options.rejectUnauthorized: false绕过自签名证书错误,后者在 TLS 握手失败时直接抛异常中断整个进程 - 不要在单线程里循环
new WebSocket()—— 会阻塞事件循环,导致后续连接超时。改用setImmediate()或Promise.resolve().then()分散调度 - 每 50 个连接后加
await new Promise(r => setTimeout(r, 10)),避免瞬间 SYN 包风暴被服务端限流或防火墙拦截 - 监听
ws.on('unexpected-response'),捕获 401/403/503 等握手阶段 HTTP 错误 —— 这类错误不会触发onerror,但连接已失效
用 wscat 快速验证单连接行为与关闭码
wscat 不是压测工具,但它是定位“为什么连不上”的第一把刀。很多所谓“并发失败”,根源在单连接就卡在握手或认证环节:
-
wscat -c ws://host/ws --header "Authorization: Bearer xxx":验证自定义 header 是否透传成功(注意空格和引号) -
wscat -c wss://host/ws --insecure:跳过 TLS 证书校验,排除证书链问题 - 连接建立后,手动输入
{"type":"ping"}并回车,观察是否返回{"type":"pong"}—— 若无响应,说明服务端未处理文本帧,或消息路由逻辑有缺陷 - 断开连接后,检查终端输出的关闭码(如
1006表示异常关闭,4001是应用层自定义断连),比看日志快十倍
避开 Chrome DevTools 的“假并发”陷阱
开发者工具的 Network 面板显示 “WS” 类型请求,但它只记录**当前标签页内由 JS 主动创建的连接**。当你用脚本批量新建 100 个 WebSocket,DevTools 只能稳定显示前 10–20 个,其余连接在面板里“不可见”,但它们真实存在并消耗资源。
更危险的是:DevTools 启用 “Disable cache” 或 “Throttling” 时,会干扰 WebSocket 的 onopen 触发时机,导致部分连接在 readyState === 0(CONNECTING)状态卡住数秒 —— 这不是服务端问题,是调试工具自身副作用。真要观测连接生命周期,用 performance.mark() 打点 + console.timeLog() 比依赖面板更可靠。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











