希望有人可以帮助我们,因为我们正在调查可以去!
我们有一个用 C# 编写的简单异步套接字服务器,它接受来自 ASP.NET Web 应用程序的连接,发送消息,执行一些处理(通常针对 DB,但也针对其他系统),然后将响应发送回客户端. 客户端负责关闭连接。
我们一直遇到问题,如果系统在很长一段时间内(通常是几天)处于重负载状态,CLOSE_WAIT 套接字会在服务器盒(netstat -a)上建立,以至于进程不会接受任何进一步的连接. 在这一点上,我们必须反弹该过程并再次运行它。
我们已经尝试对我们的 ASP.NET 应用程序运行一些负载测试以尝试复制问题(因为无法从代码中推断出某些问题)。我们认为我们已经解决了这个问题,并最终得到了问题的 WireShark数据包跟踪,在套接字服务器的日志中显示为 SocketException:
System.Net.Sockets.SocketException:远程主机在 System.Net.Sockets.Socket.BeginSend(Byte[] 缓冲区,Int32 偏移量,Int32 大小,SocketFlags socketFlags,AsyncCallback 回调,对象状态)处强行关闭了现有连接
我试图从数据包跟踪中重现该问题,因为它是一个直接与套接字服务器对话的单线程进程(使用与 ASP.NET 应用程序相同的代码),但我无法做到。
有没有人对接下来要尝试、检查的事情或我们可能做错的明显事情有任何建议?