JMeter压测IIS托管ASP.NET WebAPI出现连接超时问题
问题描述
在服务器上使用JMeter对IIS托管的ASP.NET WebAPI应用开展性能测试,压测配置为并发数2000、循环永久运行,压测启动数秒后即报Connection timed out: connect错误。压测过程中服务器CPU使用率始终处于较低水平。
已尝试的解决措施
- 在JMeter GUI中将HTTP连接超时、响应超时均设置为200000ms
- 在IIS管理器中将
requestQueueLimit设置为65535、最小工作进程数设置为15 - 在web.config文件中将
minWorkerThread、minIoThread设置为200,超时时间设置为20分钟,随后在IIS中重启应用
以上操作均未解决问题。
相关参考截图
- 服务器CPU使用率截图
- JMeter运行界面截图
报错日志
org.apache.http.conn.HttpHostConnectException: Connect to XXX.XXX.com:80 [XXX.XXXX.com/XXXX] failed: Connection timed out: connect at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:156) at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl$JMeterDefaultHttpClientConnectionOperator.connect(HTTPHC4Impl.java:408) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:376) at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393) at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236) at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186) at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89) at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110) at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83) at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.executeRequest(HTTPHC4Impl.java:939) at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:650) at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:66) at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1301) at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1290) at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:651) at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:570) at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:501) at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:268) at java.lang.Thread.run(Unknown Source) Caused by: java.net.ConnectException: Connection timed out: connect at java.net.DualStackPlainSocketImpl.connect0(Native Method)
问题根因定位与解决方案
报错发生在TCP三次握手建连阶段,请求根本没有到达ASP.NET应用处理层,这也是服务器CPU负载极低、之前调整的应用层线程配置、JMeter响应超时配置全部不生效的核心原因。按以下优先级排查修复:
- 调整Windows Server TCP协议栈默认限制
Windows Server默认的TCP连接队列、端口范围、连接回收参数阈值极低,2000并发下会直接丢弃SYN包导致客户端建连超时。- 打开注册表编辑器,定位到路径
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters,新增/修改以下DWORD值:TcpNumConnections:设置为16777214(放开最大TCP连接数限制)TcpMaxHalfOpen:设置为65535TcpMaxHalfOpenRetried:设置为65535SynAttackProtect:压测环境临时设置为0(关闭默认SYN洪水防护,避免误拦截压测流量,生产环境按需调整)TcpTimedWaitDelay:设置为30(缩短TIME_WAIT状态连接回收时间,单位秒)MaxUserPort:设置为65534(扩大可用临时端口范围)
- 修改完成后重启服务器生效。
- 打开注册表编辑器,定位到路径
- 补全IIS各层级连接队列配置
之前修改的requestQueueLimit是ASP.NET托管管道层面的队列,IIS内核层HTTP.sys、应用程序池队列是更靠前的流量入口,默认值仅1000,远低于2000并发阈值:- 打开IIS管理器,选中对应站点,进入「高级设置-连接限制」,将最大并发连接数设置为
65535 - 选中站点对应应用程序池,进入「高级设置」,将队列长度从默认的1000调整为
10000以上
- 打开IIS管理器,选中对应站点,进入「高级设置-连接限制」,将最大并发连接数设置为
- 排查中间链路限流规则
检查服务器前端的负载均衡、硬件防火墙、Windows Defender防火墙的新建连接速率、并发连接数限制,2000并发很容易触发默认的SYN包限流规则,表现为客户端建连超时、服务器侧无对应请求日志、CPU无负载。 - 修复JMeter压测端自身瓶颈
禁止用GUI模式跑高并发压测,GUI模式仅用于脚本调试,2000并发下GUI模式本身会出现资源耗尽无法发起新连接的问题:- 压测执行必须用非GUI模式,执行命令为
jmeter -n -t 你的压测脚本.jmx -l 压测结果.jtl - 打开JMeter目录下
bin/jmeter.properties配置文件,将httpclient4.max_conns、httpclient4.max_conns_per_host两个参数都调整为2500(匹配并发数要求) - 调整JMeter启动参数中的JVM堆内存为压测机物理内存的50%-70%,避免GC阻塞导致连接发起失败
- 压测执行必须用非GUI模式,执行命令为
验证方法:先将并发数降到100持续运行10分钟,如果无报错再逐步提升并发,找到报错阈值后对应调整上述参数即可。
内容的提问来源于stack exchange,提问作者zhenghao li
相关产品推荐
相关产品推荐

