背景
公司有个会议的产品,使用Tomcat的Comet作为长连接推送服务,随着产品的用户量越来越大,出现了多次无响应事件。
产品在Linux和Windows平台上都有部署,但是Linux一直比较稳定,基本上是Windows出问题。而且公司的产品大多部署在银行内部,所以无法直接服务器检查,因为这个问题一直头疼了好一阵。
分析
公司的会议产品主要是用作iPad的推送服务器,猜测网络不好的时候大量的iPad的产生异常的网络连接阻塞了服务器。
检查产品代码发现是采用Tomcat官方推荐的Comet实现代码,没有发现问题。
通过jVisualVM等工具分析本地Tomcat的服务器连接池和内存溢出,没有发现问题。
而且Linux下比较稳定,Windows容易出现问题,从这点猜测Linux平台和Windows平台的差异也是一个入口点,所以最大的怀疑对象就是网络不稳定导致的相关问题。
重现
根据不断的查找TCP相关协议,猜测客户服务器那边很可能出现了TIME_WAIT,CLOSE_WAIT的TCP连接异常(这点实在是苦逼啊,没法从客户那边的服务器取证。。。)
既然有了怀疑对象就好说了,验证中......
既然网上的文章大都在讲怎么优化,那我这里为了验证问题只能反着来了(实际上反证法没法很准去的验证问题,因为多个异常的现象可能会一样啊,无论如何实验进行下去!)。
调整TcpTimedWaitDelay,MaxUserPort 参数
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters] "TcpTimedWaitDelay"=dword:0000001e "MaxUserPort"= 20000
长时间的观察中,未完待续。。。
参考资料
http://www.cnblogs.com/tianzhiliang/articles/2400176.html
http://blog.csdn.net/mhfh611/article/details/8769617
http://blog.csdn.net/shootyou/article/details/6622226
http://blog.csdn.net/zdwzzu2006/article/details/7716904