单台IIS能否承载10万SignalR连接?1.6万连接报端口占用错如何优化
问题解答
你的判断基本正确,你遇到的报错:
Only one usage of each socket address (protocol/network address/port) is normally permitted
是典型的TCP端口/套接字耗尽导致的WSAEADDRINUSE错误,但你当前的配置存在多处错误,还需要从系统、IIS、SignalR、客户端多侧做优化:
现有配置的核心问题
processModel配置完全无效:maxWorkerThreads、maxIoThreads的有效值为单CPU核心最大100,你填写的999999会被系统自动截断为默认值,反而会引发线程调度过载,影响连接处理效率。- 你当前卡在16000连接的直接原因是Windows默认临时端口范围限制:默认出站动态端口范围为49152~65535,总共仅16384个可用端口,如果你是在同一台机器上同时运行测试客户端和IIS服务端,客户端发起的出站连接会直接占满所有临时端口,触发报错。
可调整的优化配置
服务端(Windows Server 2016 + IIS 侧)
- 修正
machine.config配置
按你服务器的CPU核心数配置参数,以16核心服务器为例:
<system.web> <processModel autoConfig="false" maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50" minIoThreads="50" /> <httpRuntime minFreeThreads="90" minLocalRequestFreeThreads="80" /> </system.web>
- 调整TCP/IP栈参数
在注册表路径HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters下添加/修改以下DWORD值:
MaxUserPort:已设为65535,可保留TcpTimedWaitDelay:已设为30,可保留TcpNumConnections:设为16777214,解除系统默认TCP最大连接数限制EnablePortReuse:设为1,开启端口复用,减少TIME_WAIT状态端口占用
- IIS配置调整
- 对应站点高级设置中,将「最大并发连接数」调整为100000以上
- 对应应用程序池高级设置:
- 启动模式设为
AlwaysRunning - 闲置超时(分钟)设为
0 - 定期回收间隔(分钟)设为
0 - 队列长度设为
65535以上
- 启动模式设为
- SignalR服务端配置
在Startup类的服务配置中,调高单连接并发处理限制,关闭不必要的协议支持降低开销。
客户端侧优化
- 不要在单台机器上发起10万连接测试:单台设备最多只有6万多可用临时端口,不可能支撑10万出站连接,建议用多台客户端机器分片发起连接测试。
- 修正代码端口泄漏问题:每次调用
sc.Stop()后主动将connection对象置为null,释放底层套接字资源,避免无效端口占用。 - 替换同步阻塞逻辑:将
connection.Start().Wait()改为异步await写法,减少线程阻塞开销,提升连接建立效率。
内容的提问来源于stack exchange,提问作者Michal_Drwal
相关产品推荐
相关产品推荐

