Назад | Перейти на главную страницу

Низкая производительность приложений на Windows Server 2008 R2

У меня есть простое приложение, которое прослушивает 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 - это действительно помогло бы определить, в чем проблема в ОС.