У меня есть простое приложение, которое прослушивает TCP-соединения на определенном порту и создает новый поток для обработки каждого соединения. Приложение написано на C # .NET 4.0 и использует объект TCPListener для обработки базовых соединений сокетов.
У меня также есть простой инструмент нагрузочного тестирования, который создает TCP-соединение с моей службой, а затем отключается. Я могу настроить его на отправку тысяч запросов одновременно.
Итак, если я запускаю приложение tcp server на сервере Windows Server 2003, я могу отправить ему более 10 000 запросов без сбоя ни одного из них. Но когда я запускаю его на Windows Server 2008 R2, я могу отправить только около 2000 без каких-либо сбоев.
Вот результаты моих тестов для 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?
Спасибо.
Я разобрался в чем дело и как это исправить. Проблема заключалась в исчерпании возможностей порта 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.
Теперь я могу отправить 20000 запросов на ящик 2008 R2 и получить 0 отказов. Спасибо!
Идентично ли аппаратное обеспечение двух систем? Когда вы проверяете, используют ли они один и тот же сетевой порт? Это может быть плохой порт.
Может быть, это как-то связано с SNP (Scalable Networking Pack)? Если у вас нет SNP, примененного к вашей машине 2k3, но он установлен и с устаревшим драйвером сетевой карты на машине 2k8, у вас может быть плохая производительность, пока вы не обновите драйвер или не отключите TCP Chimney Offload.
Кроме того, вы можете добавить в код несколько операторов отладки по времени, чтобы помочь определить именно какие операции выполняются или занимают больше времени на 2k8 - это действительно помогло бы определить, в чем проблема в ОС.