我有一个简单的应用程序,监听特定端口上的TCP连接,并创build一个新线程来处理每个连接。 该应用程序是用C#.NET 4.0编写的,并使用TCPListener对象来处理底层套接字连接。
我也有一个简单的负载testing工具,创build一个TCP连接到我的服务,然后断开连接。 我可以设置它同时发送数千个请求。
所以,如果我在Windows Server 2003上运行tcp服务器应用程序,我可以向它发送超过10,000个请求,而不会失败。 但是,当我在Windows Server 2008 R2上运行它时,我只能发送大约2000次而没有任何失败。
这里是我的Windows Server 2008 R2的testing结果…
D:\>EchoServerTest.exe -server server01 -port 8000 -connections 10000 Creating 10000 connections All connections in progress All connections complete in 20816ms 7252 established. 2748 failed. Connection establishment errors 1693 - The semaphore timeout period has expired. 1055 - The remote computer refused the network connection. Test Passed
这里是我的Windows Server 2003testing的结果…
D:\>EchoServerTest.exe -server server02 -port 8000 -connections 10000 Creating 10000 connections All connections in progress All connections complete in 3807ms 10000 established. 0 failed. Connections reset 642 - An existing connection was forcibly closed by the remote host. Test Passed
两个不同的操作系统,但执行相同的代码。 任何人都有什么想法,为什么2008 R2的性能更差?
谢谢。
我想清楚发生了什么事以及如何解决这个问题。 问题是TCP / IP端口耗尽。 这是解决我的问题的修复程序。 (我发现从http://social.msdn.microsoft.com/Forums/en/winserver2008appcompatabilityandcertification/thread/36fd41b5-f57a-4401-af9b-328760ac5d38下面的信息)
增加dynamic分配给客户端TCP / IP套接字连接的临时端口的上限范围。
1)启动registry编辑器。
2)浏览到,然后在registry中单击以下项:HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters
3)在编辑菜单上,单击新build,DWORD值,然后添加以下registry值以增加可通过dynamic分配给客户端的短暂端口数:
数值名称:MaxUserPort
数值数据: <Enter a decimal value between 5000 and 65534 here>
4)closuresregistry编辑器。
注意:您必须重新启动计算机以使此更改生效。
注意:增加用于客户端TCP / IP连接的临时端口的范围会消耗Windows内核内存。 不要将此设置的上限增加为高于容纳客户端应用程序套接字连接所需的值,以尽量减less不必要的Windows内核内存消耗。
我现在可以发送20000个请求到2008 R2的盒子,我得到0失败。 谢谢!
两个系统的硬件是相同的吗? 当你testing时,他们是否使用相同的networking端口? 这可能是一个糟糕的端口。
这可能是与SNP(可扩展networking包)有关吗? 如果您没有在您的2k3机器上应用SNP,但在2k8机器上安装了过时的NIC驱动程序,则在更新驱动程序或禁用TCP Chimney Offload之前,性能可能会很差。
另外,你可以在你的代码中join一些定时debugging语句,以帮助确定2k8上究竟是什么操作或更长的时间 – 这确实有助于确定操作系统中的问题。