近期解决了一个IIS SqlServer环境的ERP软件的问题
环境相对简单:IIS SqlServer ERP ESET
系统里就3个软件:ERP、SqlServer(ERP需要)、ESET(考虑杀毒防护软件无关变量影响,已经卸载掉了问题依旧)
一般访问不了的时候, netstat -ano|findstr :808查看Established的IP,一般就几个,但有个别连接数相较其他的IP较多
统计808建连数,用netstat -ano|findstr :808|find /c "内网IP:808"
比如netstat -ano|findstr :808|find /c "172.16.0.16:808"
服务器配置较高,各指标都不是很高,访问不了的时候,某些IP一直跟808端口Established建连且建连数较多但在服务器级别这点连接数不是瓶颈,主要还得看ERP有什么特殊限制
如果是普通的IIS网站,不可能访问八九个客户端就访问不了,有些ERP有套餐、特殊配置等限制,每次访问不了的时候把808 Established数最高的IP禁止后就恢复了,还是怀疑ERP软件有什么特殊配置或限制,问ERP软件方了,ERP那边的人说他们客户较多,没遇到过这种问题
由于ERP软件方售后服务跟不上,联系软件方比较费劲,只能自己研究了
1、wcf相关4个服务
2、wcf相关程序和配置文件
32位:
C:WindowsMicrosoft.NETFrameworkv4.0.30319SMSvcHost.exe
C:WindowsMicrosoft.NETFrameworkv4.0.30319SMSvcHost.exe.config
64位:
C:WindowsMicrosoft.NETFramework64v4.0.30319SMSvcHost.exe
C:WindowsMicrosoft.NETFramework64v4.0.30319SMSvcHost.exe.config
3、性能调优
①借助微软资料和给微软开单咨询
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/configuring-the-net-tcp-port-sharing-service
搜到1篇相关场景的微软文档,涉及2个指标:maxPendingAccepts和maxPendingConnections 。
后给微软发单咨询最佳实践,微软建议:
maxPendingAccepts:5-10
maxPendingConnections :100-200
According to the Product Team, you shouldn't increase “maxPendingAccepts” too much. 5-10 would be a good number. It means it spawns 5-10 concurrent threads to pull connections.
Feel free to increase the maxPendingConnections value according to your needs (you can also set 1000, even though I'd wonder why if you needed so many connections. 100-200 can be considered a good choice).
最终调成下面这样还是没起作用,问题依旧每天都发生
https://docs.microsoft.com/en-us/archive/blogs/asiatech/modifying-smsvchost-exe-config-for-wcf-some-common-mistakes
https://docs.microsoft.com/en-us/archive/blogs/andreal/net-tcpip-port-sharing
②寻求ERP软件方支持或最佳实践文档,联系不上软件方,放弃
③研究ERP软件,它是IIS环境下跑的,仔细研究IIS环境,发现w3wp.exe只有3个进程,分别对应一个应用程序池,这3个应用程序池正好是用户的3个虚拟站点,跟用户了解到3个站的访问压力不同,尝试给不同站点的应用程序池配置有差别的Maximum Worker Processes,发现效果很明显,结合服务器CPU、内存、磁盘、网络的能力范围和业务表现最终把3个应用程序池的Maximum Worker Processes调到了一个合适的值
这里的经验就是,1个Worker Process大概占用500MB内存,给数据库和操作系统本身留够内存后,
剩下的内存数(MB)/ 500(MB)= n
稳妥点n-1差不多就是Maximum Worker Processes的值了
当然,如果实在不知道设置几,那就指定为0观察下
iisreset /restart命令执行后,一般在5分钟内,w3wp.exe的数量会从1逐步增加到所有Worker Process的数目总和,总数是使用中的应用程序池的Maximum Worker Processes的总和,可以用powershell执行get-process w3wp | measure统计w3wp.exe数目的变化。
最终,是通过调应用程序池的Maximum Worker Processes调到了一个合适的值解决的。
最大工作进程数的设置方法:按照每工作进程能承载30个并发的原则来确定应用程序池的最大工作进程数。同时要注意,每个工作进程大约会占用500M左右的系统内存,在设置最大工作进程数的时候,不要超过系统最大可用内存数。一般情况下,建议按照每次增加5个工作进程数的方式对最大工作进程数进行调整,调整完后对网站观察一段时间,如依然无法满足要求,再继续增加5个工作进程数。