我根据您的建议开发了一个TCP服务器:High performance TCP server in C#
它基于异步模式。
我还开发了一个压力测试应用程序来测试它的性能。我的服务器可以从我的压力测试应用程序并行获得数千个连接,可以解析数据并将其保存到我的数据库中。
当我对我的服务器施加压力时,我可以从我的服务器收到“System.Net.Sockets.SocketException”无法建立连接,因为目标机器主动拒绝它“错误,所以我必须重新连接它。如果我测试它有 5000 个并发连接,由于这个问题,我必须再次尝试连接 10-20% 的连接,如果我用 10K 并发连接测试它,它可能是 30-40%。有时它可能 - 很少 - 更多, 超过 50%。它似乎无法处理连接接受:我从我的压力测试中尽可能多地建立新连接——大约 120 个连接/秒。
那么,是什么导致了这种异常呢?如何处理?在服务器端实现中要做什么来避免这个问题?如何调整 TCP 连接接受?
提前致谢!
最佳答案
您可能时不时地用完可用端口。您可以使用 SysInternals 的 TcpView 实用程序轻松查看它。
在 Windows 上,当您释放端口时,它不会立即进入可用状态,而是会在一段时间内处于 TIME_WAIT 状态。在离开此状态之前,任何应用程序都不能使用此端口。时间延迟、最大端口数和可用端口范围都因操作系统而异,XP vs Win7 vs Win2008 Server。
有两个注册表项可以减少这个时间间隔:
HKLM/System/CurrentControlSet/Services/Tcpip/Parameters/TCPTimedWaitDelay
并增加应用程序可以打开的最大端口数:
HKLM/System/CurrentControlSet/Services/Tcpip/Parameters/MaxUserPort
编辑:MaxFreeTcbs
似乎是可以提供帮助的第三种设置(我还没有尝试过),在 this TechNet article 中提到。其中有更多关于追踪奇怪的网络问题的建议。 HTH.
关于c# - 高性能C# TCP服务器问题: No connection could be made because the target machine actively refused it,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6236890/