У Windows Server 2012 R2 не вистачає ефемерних портів, хоча це не повинно


13

Ми регулярно відчуваємо дивні проблеми з мережею на нашому спеціалізованому сервері. Він працює під керуванням Windows Server 2012 R2 x64 на Xeon E5620 з 16 ГБ оперативної пам’яті та мережевим адаптером Intel 82575EB.

Зауважте, що ми вже налаштували HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parametersключові значення TcpTimedWaitDelayта MaxUserPortвідповідно 30 та 65530.

У випадковий момент часу наші веб-сайти перестають відповідати, тому вони не можуть підключитися до локальної бази даних. Це приблизно 2 тижні часу, коли ці проблеми починають відбуватися. Системний журнал починає отримувати попередження 4227 та 4231 TCPIP. У ньому зазначається "Запит на виділення ефемерного номера порту з глобального простору порту TCP не вдався через те, що всі такі порти використовуються."

Якщо я біжу

Get-Counter -Counter \TCPv4\*

або

Get-Counter -Counter \TCPv6\*

або

netstat -abn | find /c ":"

Я завжди отримую розумне значення 500-1500 підключень, що навіть не близько 65K.

Крім того, "localhost" припиняє вирішувати значення :: 1 локально, повертаючись до 127.0.0.1
Тільки примусовий перезапуск машини може вирішити ситуацію.

Можливо, це проблема з мережевим адаптером?

ОНОВЛЕННЯ 1

Це повторилося і, здавалося, було вирішено, коли я перезапустив поштовий сервер. Дивно, але всі лічильники показали ~ 1000 з'єднань з ~ 500 активними на даний момент, і все ще помилка сокета 10055 при спробі підключення до бази даних, яка не має нічого спільного з поштовим сервером.

ОНОВЛЕННЯ 2 Це дивно, але щоденний перезапуск поштових сервісів усуває проблему повністю.


1
У мене була подібна проблема, і для мене виправили наступне посилання: http://blogs.technet.com/b/kimberj/archive/2012/07/06/sever-quot-hangs-quot-and-ephemeral-port- източення-issues.aspx

2
Про ОНОВЛЕННЯ 2. Отже, це просто вказує на те, що поштові сервіси генерують занадто багато з'єднань, не закриваючи їх, і ви не вирішили проблему, а просто прихойте її, поки вона не стане гіршою, і буде потрібно якийсь час 2 перезавантаження в день ... Схоже, приховування, а не вирішення проблема ...
Михайло

Відповіді:


9

У мене були подібні проблеми із вичерпаним пулом портів TCP / IP на WinSvr 2012R2 x64 протягом майже 1 місяця, коли сервер перестав отримувати будь-які нові та TCP-з'єднання. Тому я грав зі значеннями реєстру, і вони стабільні для мене:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"TcpTimedWaitDelay"=dword:0000001e
"MaxUserPort"=dword:0000fffe
"TcpNumConnections"=dword:00fffffe
"TcpMaxDataRetransmissions"=dword:00000005
  • TcpTimedWaitDelay - 30
  • MaxUserPort - 65534
  • TcpNumConnections - має бути у замовчуванні, розтягнутим до максимуму = 16777214 повинно запобігти серверу не виснажувати ефемерні порти.
  • TcpMaxDataRetransmissions - обмеження часу очікування повторної передачі сегментів даних TCP за фактичним з'єднанням = 5.

У результаті такий же, як і ваш. Я думаю, вам слід розглянути можливість перевірки поведінки ваших програм / сценаріїв. Якщо все нормально, і нічого не допоможе, тоді ви можете спробувати поставити проксі-сервер перед сервером веб-додатків, зробити 2 вузли з веб-сервером (IIS, Apache, ...), які будуть спільно використовувати один і той же статичний вміст і отримувати доступ до тієї ж бази даних одночасно час (якщо у вас достатньо ресурсів у вашій компанії).

Можливо, ця стаття допоможе вам певним чином: http://blogs.technet.com/b/tristank/archive/2008/03/11/maxuserport-what-it-is-what-it-does-when-it- s-важливий.aspx


1
Ви повинні ретельно прочитати питання, перш ніж відповісти. Звичайно, я спробував це рішення, перш ніж запитати, це дуже часто. Я вже вирішив проблему іншим способом.
CamaroSS

1
Я думаю, щоденний перезапуск поштових сервісів не є вирішеною проблемою. Ви знайшли інше рішення?
MyKE

3
@CamaroSS: Будь ласка, поділіться своїм рішенням (якщо воно виходить за рамки "перезапуск поштової служби" - це не є рішенням). Крім того, можливо, ви повинні це оцінити трохи більше, якщо хтось намагається вам допомогти.
Свен

@CamaroSS І якщо ви уважно прочитаєте мою відповідь, ви побачите "В результаті такий же, як і ваш", то я опублікував іншу інформацію ..
MyKE

1
Чи налаштування MaxUserPortвсе ще працює у 2012 році? Я думав, що у 2012 році ви повинні це зробити через netsh. наприклад:netsh int ipv4 set dynamicport tcp start=25535 num=40000
rustyx

4

Окрім налаштувань драйвера Tcpip, діапазон ефемерних TCP-портів керується в Windows Server за допомогою команди netsh ( джерело ).

Ви можете переглянути динамічний діапазон портів за допомогою наступних команд:

  • netsh int ipv4 show dynamicport tcp
  • netsh int ipv4 show dynamicport udp
  • netsh int ipv6 show dynamicport tcp
  • netsh int ipv6 show dynamicport udp

Щоб змінити діапазон портів, використовуйте цю команду:

  • netsh int <ipv4|ipv6> set dynamic <tcp|udp> start=number num=range

Наприклад:

netsh int ipv4 set dynamicport tcp start=49152 num=16384

Параметр (start = 49152 num = 16384 ) також є типовим для Windows Server 2008 і далі.


Дякую вам за це - я вже витратив години на намагання вирішити свою проблему. Всі поради, які я міг знайти, стосувалися коригування MaxUserPort у реєстрі, і ніхто не згадав про neth.
milosz

3

Якщо у цій же проблемі на Windows Server 2016 було запущено велику кількість тестів Selenium за допомогою Chromeewebdriver. Цей скрипт PS автоматично налаштовує налаштування @Myke, що ділилися вище. shutdownКоманда була додана , оскільки потрібне перезавантаження для зміни стека TCP.

Збільшити розмір пулу для ефемерних портів TCP

Get-Item 'HKLM:\System\CurrentControlSet\Services\Tcpip\Parameters' | New-ItemProperty -Name MaxUserPort -Value 65534 -Force | Out-Null
Get-Item 'HKLM:\System\CurrentControlSet\Services\Tcpip\Parameters' | New-ItemProperty -Name TcpTimedWaitDelay -Value 30 -Force | Out-Null
Get-Item 'HKLM:\System\CurrentControlSet\Services\Tcpip\Parameters' | New-ItemProperty -Name TcpNumConnections -Value 16777214 -Force | Out-Null
Get-Item 'HKLM:\System\CurrentControlSet\Services\Tcpip\Parameters' | New-ItemProperty -Name TcpMaxDataRetransmissions -Value 5 -Force | Out-Null

shutdown -r -t 0

Це повідомлення про помилку, яке ми отримували, Webdriver.Quit()повідомляючи нам, що використовується TCP-адреса.

Помилка : EADDRINUSE підключення EADDRINUSE 127.0.0.1.1:12843 на ClientRequest. (\ node_modules \ selenium-webdriver \ http \ index.js: 238: 15)
Від : Завдання: WebDriver.quit ()


1

Ви переконалися, що у вас не протікають об'єкти підключення до бази даних? Ви повинні закрити кожне відкрите підключення до бази даних, явно (із спробою остаточно) або за допомогою блоку {}. Це поширена проблема, про яку ASP безпосередньо вам не розповість.


Це купа сайтів PHP, більшість з них працює через FastCGI, використовуючи постійне з'єднання, тому це не повинно бути так. Якби це було, то системні лічильники повертали б набагато більші значення. Я також не можу пояснити, чому localhost раптом перестає вирішувати значення :: 1 і замість цього дорівнює 127.0.0.1.
CamaroSS

2
:: 1 зникнення, ймовірно, є лише побічним ефектом переповнення допустимих портів - я підозрюю, що Windows намагається пінг IPv6 і коли не може отримати порт для спроби, він повертається до IPv4. PHP - за межами моїх областей. :-(. Удачі!
Джеймс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.