JMeter压测SignalR高并发时连接超时故障排查求助
SignalR负载测试(JMeter)高并发下连接超时问题
我用JMeter做SignalR负载测试,流程为首次发起HTTPS请求,第二次发起WSS请求。线程数设置为100时测试完全正常,但提升至500及以上后,80%的请求失败,报错信息如下:
HTTP /chat请求报错
Thread Name: SignalR 1-788 Sample Start:2024-08-15 17:05:10 EEST Load time:21042 Connect Time:21042 Latency:0 Size in bytes:2908 Sent bytes:0 Headers size in bytes:0 Body size in bytes:2908 Sample Count:1 Error Count:1 Data type ("text"|"bin"|""):text Response code:Non HTTP response code: org.apache.http.conn.HttpHostConnectException Response message:Non HTTP response message: Connect to xxx.azurewebsites.net:443 [xxx.azurewebsites.net/xxx.xxx.0.xxx] failed: Connection timed out: connect HTTPSampleResult fields: ContentType: DataEncoding: null
WebSocket连接请求报错
Thread Name:SignalR 1-754 Sample Start:2024-08-15 16:38:30 EEST Load time:21045 Connect Time:0 Latency:0 Size in bytes:0 Sent bytes:0 Headers size in bytes:0 Body size in bytes:0 Sample Count:1 Error Count:1 Data type ("text"|"bin"|""): Response code:Websocket I/O error Response message:WebSocket I/O error: Connection timed out: connect SampleResult fields: ContentType: DataEncoding: null
所有失败请求的Load time均超过20000ms。已将HTTP请求超时、WebSocket连接/读取超时设置为300000ms,尝试过不同网络环境(4-6Mbps WiFi、12-15Mbps WiFi、35-42Mbps 4G热点),关闭防火墙与杀毒软件,增加ramp-up时间,但问题依旧存在。
可能原因及解决方案
1. Azure App Service服务器端连接限制
你使用的Azure App Service对并发连接数有明确的层级限制:
- 免费/共享层:并发连接数上限极低(通常仅几百)
- 基本/标准层:每个实例的并发连接数有限制(如标准层单实例默认约1000-2000,具体取决于SKU)
SignalR本身基于长连接,当并发线程达到500时,很容易触达服务器的连接上限,导致新连接超时。
解决方法:
- 查看Azure App Service监控指标(
Connections、WebSocket Connections),确认是否达到连接上限 - 升级App Service的SKU,或增加实例数量进行横向扩容
- 若使用Azure SignalR Service,检查其单元数是否足够支撑当前并发连接需求
2. JMeter客户端系统资源/连接限制
JMeter运行机器存在系统级TCP连接限制:
- 本地可用端口数量(Windows默认范围16384-65535,约49k,但TIME_WAIT状态的连接会持续占用端口)
- TCP连接TIME_WAIT超时设置(Windows默认240s,Linux默认60s)
短时间内创建大量连接会耗尽本地端口,导致无法建立新连接,最终触发超时。
解决方法:
- 调整系统TCP参数:
- Windows:修改注册表
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters,将MaxUserPort设为65535,TcpTimedWaitDelay设为30 - Linux:执行
sysctl -w net.ipv4.tcp_tw_reuse=1、sysctl -w net.ipv4.tcp_tw_recycle=1,调整net.ipv4.ip_local_port_range扩大端口范围
- Windows:修改注册表
- 采用JMeter分布式运行:用多台机器作为负载生成器,分摊连接压力,避免单台机器资源瓶颈
3. JMeter配置优化不足
即便设置了超时,JMeter默认连接池配置可能无法应对高并发场景:
- HTTP请求默认连接池大小不足,导致等待获取连接的时间过长
- WebSocket采样器的连接管理未做针对性优化
解决方法:
- 在
HTTP Request采样器的Advanced标签下,将Max Connections per Host和Max Total Connections设为500以上 - 确认
HTTP Keep-Alive功能处于启用状态 - 修改JMeter的
user.properties文件,调整以下参数:httpclient.max_total=2000 httpclient.max_per_host=500
4. SignalR协议额外开销
SignalR的协商、连接过程存在额外HTTP请求,高并发下这些请求会加剧服务器负载,进而导致连接超时。
解决方法:
- 优先使用SignalR最新协议版本(如WebTransport,需服务器支持),降低连接开销
- 在JMeter中添加
HTTP Cache Manager,缓存协商请求结果,避免重复发起协商请求
内容的提问来源于stack exchange,提问作者Nour Mawla
相关产品推荐
相关产品推荐

