高性能C# TCP服务器问题:无法建立连接,因为目标计算机积极拒绝了它。

6
我根据你的建议开发了一个TCP服务器:C#高性能TCP服务器,它是基于异步模式实现的。我还开发了一个压力测试应用程序来测试其性能。我的服务器可以从压力测试应用程序中并行获取数千个连接,并解析数据并保存到我的数据库中。
当我对服务器进行压力测试时,有时会出现“System.Net.Sockets.SocketException”错误:“无法建立连接,因为目标计算机积极拒绝”。因此,我必须重新连接。如果我使用5000个并发连接进行测试,则由于此问题,我必须尝试重新连接10-20%的连接;如果我使用10K个并发连接进行测试,则可能达到30-40%。有时甚至可能超过50%。看起来它无法处理连接接受:我从我的压力测试中尽可能地创建新连接 - 大约每秒120个连接。
那么,什么会导致这种异常?如何处理它?在服务器端实现中该怎么做才能避免这个问题?如何调整TCP连接接受?谢谢!

我认为这就是压力测试的全部意义——确保您的机器能够处理负载。这也是您发现在接近容量极限时会发生什么的方法。 - DOK
是的,但如果可能的话,我想让它变得更好。 - Tom
1
如果你想让你的软件更好,确保它正确处理异常。你无法防止或避免它们。 - H H
谢谢:)我提出问题的主要原因是我不确定是否已经达到了我的机器的最大性能,或者通过改进一些设置或我的代码等是否可以使它更好。 - Tom
你是否有在某处发布过一段服务器代码? - dariol
2个回答

8

有时您可能会用尽可用端口。您可以使用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中提到,其中有更多关于跟踪奇怪网络问题的建议。希望对您有所帮助。


MaxUserPort: 65534 - 据我所知不能再多了;TCPTimedWaitDelay: 30. - 你认为这个应该改变吗?谢谢。 - Tom
测试和测量;-)我添加了一篇文章的链接,提到了第三个参数,以防这可以帮助您,设置为MaxFreeTcbs - Chris O
1
所以,我进行了更多的测量。我的问题不是关于端口耗尽,并且与这些参数无关。如果我以每秒最大170个连接速率建立新的连接,则不会出现此异常。如果我以这个速率建立连接,即使我可以在不出现任何错误的情况下建立10,000个并发连接。如果我将其设置得更高,则会出现此异常。我不知道最大连接速率是否正常...因为我认为它取决于操作系统和硬件。 - Tom
@ChrisO MaxUserPort和TCPTimedWaitDelay对于将FTP连接最大化到服务器非常有效。但我很好奇,设置这些值是否存在任何安全缺陷或劣势?它可以显著提高性能,我不禁想到是否有什么问题。 - Despertar

3
您正在建立的连接速度比软件能够监听新连接的速度更快,换句话说,您已经达到了该端口每秒连接数的限制。我认为通过监听第二个端口,您可以将每秒连接数翻倍,在客户端方面,当您遇到异常时只需重新连接即可。
还有一些连接数量限制,详见Chris O 的答案

你是对的。如果我在每个端口以最大170个连接/秒的速率建立新连接,我就不会遇到这个异常。如果我以此速率建立连接,即使有10,000个并发连接也不会出现任何错误。 - Tom
嗨Tom,我遇到了同样的问题。当我的监听端口每秒接受超过200个连接时,以下连接将会得到相同的异常。我能知道你是如何解决它的吗? - kevin
@kevin,你需要在问题上放置该评论,而不是在答案上。由于我们两个人的名字相同,在这里你无法使用@来指定他... - Tamara Wijsman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接