Windows Server 2008 R2 上的应用程序性能不佳

Windows Server 2008 R2 上的应用程序性能不佳

我有一个简单的应用程序,它侦听特定端口上的 TCP 连接并创建一个新线程来处理每个连接。该应用程序用 C#.NET 4.0 编写,并使用 TCPListener 对象来处理底层套接字连接。

我还有一个简单的负载测试工具,它可以与我的服务建立 TCP 连接,然后断开连接。我可以将其设置为同时发送数千个请求。

因此,如果我在 Windows Server 2003 上运行 TCP 服务器应用程序,我可以向其发送 10,000 多个请求,而不会出现任何失败。但是,当我在 Windows Server 2008 R2 上运行它时,我只能发送大约 2,000 个请求而不会出现任何失败。

以下是我对 Windows Server 2008 R2 的测试结果...

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 2003 的测试结果...

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 的性能更差吗?

谢谢。

答案1

我弄清楚了发生了什么,并知道如何修复它。问题是 TCP/IP 端口耗尽。以下是解决我问题的修复方法。(我从以下网站找到了以下信息http://social.msdn.microsoft.com/Forums/en/winserver2008appcompatabilityandcertification/thread/36fd41b5-f57a-4401-af9b-328760ac5d38

增加动态分配给客户端 TCP/IP 套接字连接的临时端口的上限范围。

1)启动注册表编辑器。

2) 浏览到注册表中的以下项,然后单击该项:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

3) 在编辑菜单上,单击新建、DWORD 值,然后添加以下注册表值以增加可动态分配给客户端的临时端口数量:

值名称:MaxUserPort

值数据:<Enter a decimal value between 5000 and 65534 here>

4)关闭注册表编辑器。

注意:您必须重新启动计算机才能使此更改生效。

注意:增加用于客户端 TCP/IP 连接的临时端口范围会消耗 Windows 内核内存。请勿将此设置的上限值增加到高于容纳客户端应用程序套接字连接所需的值,以尽量减少不必要的 Windows 内核内存消耗。

我现在可以向 2008 R2 机器发送 20000 个请求,没有出现任何失败。谢谢!

答案2

两个系统的硬件是否相同?测试时,它们是否使用相同的网络端口?可能是端口有问题。

这可能与 SNP (可扩展网络包) 有关吗?如果您的 2k3 机器上没有应用 SNP,但在 2k8 机器上安装了它并且使用过时的 NIC 驱动程序,则您的性能可能会很差,除非您更新驱动程序或禁用 TCP Chimney Offload。

此外,您还可以在代码中添加一些时序调试语句来帮助确定确切地在 2k8 上哪些操作需要更长时间 - 这确实有助于确定操作系统中的问题所在。

相关内容