.NET 4.5 WCF应用卡顿靠IIS应用池回收修复,需排查监测方案
WCF NetTcpBinding 卡顿问题排查方案
优先排查方向
- 首先排查NetTcpBinding的连接池泄漏问题:当前配置未显式设置
maxConnections参数,WCF NetTcp绑定默认连接数上限为10,运行多年后客户端连接规模上涨很容易出现连接池耗尽,新请求排队阻塞导致卡顿,回收应用池会清空连接池因此暂时恢复,这是该场景下最常见的诱因。 - 检查WCF会话超时配置:NetTcp默认启用会话模式,当前
receiveTimeout设为5分钟,若客户端未正常关闭连接,服务端会持续持有会话连接,累计到连接池上限后新请求会进入长时间等待。 - 验证TCP端口耗尽/ TIME_WAIT堆积情况:Windows Server 2012 R2默认动态端口范围是49152-65535,若业务存在大量短连接场景容易出现端口占满,卡顿的时候执行
netsh int ipv4 show dynamicport tcp和netstat -ano | findstr TIME_WAIT即可确认状态。 - 检查NetTcp端口共享服务状态:IIS部署的NetTcp绑定依赖
NetTcpPortSharing系统服务,若服务出现请求堆积或者运行异常,会直接导致连接处理变慢,可查看系统事件日志中是否存在该服务的警告、错误记录。 - 核对安全配置差异:当前HTTP绑定配置了Windows传输认证,TCP绑定未显式设置安全模式,NetTcp默认启用
Transport安全模式,若客户端和服务端的Kerberos/NTLM认证出现缓存失效、域控查询延迟,也会导致TCP连接建立阶段耗时升高。
需要补充监测的指标
- WCF专属性能计数器:路径为
ServiceModelService 4.0.0.0和ServiceModelOperation 4.0.0.0,重点监控以下指标:- Calls Queued(排队的调用数)
- Calls Outstanding(未处理的调用数)
- Instance Count(服务实例数)
- Connection Pool Count(连接池计数)
- TCP链路相关指标:
- TCPv4的Connections Established、Connections Reset、Retransmitted Segments计数
- 网卡的TCP Offload设置,确认是否开启RSS(接收端缩放),老服务器网卡驱动更新后偶尔会出现Offload异常导致TCP延迟升高
- 应用池进程的线程计数:卡顿的时候查看w3wp进程的线程数,若超过日常正常水平2倍以上,大概率是出现了连接等待导致的线程阻塞。
临时验证&解决方案
- 先临时调整NetTcpBinding配置,添加显式连接数限制,可先关闭安全模式验证是否为认证环节问题:
<binding name="TCPSecured" receiveTimeout="00:05:00" sendTimeout="00:05:00" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" maxConnections="1000"> <!-- 按实际客户端规模调整,建议设为日常峰值连接数的2倍 --> <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> <!-- 先临时设为None测试,若卡顿消失则说明是认证环节的问题,再针对性调整安全配置 --> <security mode="None"> </security> </binding>
- 若调整配置后卡顿消失,可进一步优化稳定性:
- 服务端的服务实现类添加
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)]特性,减少会话持有时间 - 客户端代码添加资源释放逻辑,通过
using块或者显式调用Close()/Abort()方法,确保连接用完及时释放 - 调整系统TCP参数:执行
netsh int ipv4 set dynamicport tcp start=1024 num=64511扩大动态端口范围,执行netsh int ipv4 set tcpglobal timestamps=enabled开启TCP时间戳,减少TIME_WAIT堆积
- 服务端的服务实现类添加
- 若上述调整无效果,可开启WCF诊断日志,在web.config中添加诊断配置记录WCF的消息处理和错误日志,定位具体阻塞的业务环节。
内容的提问来源于stack exchange,提问作者PatFromCanada
相关产品推荐
相关产品推荐

