网站,调用编写了缓冲功能的WCF,看上去一切正常。结果没多久忽然发现网站几乎不能访问了,偶尔会可以用一下,然后又抽风了……把网站的错误日志拉下来一看,统统都是这个错:
TCP 错误代码 10048: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。
查了很多资料,也想了很多办法,甚至用截包软件分析了TCP数据流,最后发现,好白痴啊:当没有设置过TCP参数的时候,Windows服务器默认定义用户可用TCP端口号5000个,每个TCP连接的回收等待时间是10分钟。也就是说,每10分钟只能有5000个WCF调用通道可供使用,1分钟500个,1秒钟8.3个。假设,每个页面要使用4次调用(由于页面都是用多个控件拼接出来的,所以多次调用也很正常),就是说,每秒的页面刷新量不能超过2次。这还不堵塞,真是没天理了。
解决方案:
1 修改用户使用TCP端口上限
注册表:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
添加或修改DWORD项MaxUserPort,设置值为60000(MS建议ExchangeServer的设置);
2 修改TCP线程自动回收等待时间
注册表:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
添加或修改DWORD项TCPTimeWaitDelay,设置值为60(这里的单位是秒,可以比1分钟更短,视具体情况而定);
修改完这部分的注册表,是要重新启动服务器才起效的。
注意:这是改IIS服务器的注册表,而不是WCF服务器的注册表。当然通常它们是一台服务器,不过是一台服务器的话,也没必要这么麻烦了吧。
经过这样的修改,每秒可以支持1000个WCF调用通道生成,总算是不报错了。--b
当然,如果可以的话,还是要尽量采用连接池方法,减少系统开销。
总之目前是临时修正掉这个错误了,让做网站的同事慢慢优化程序去。