В Windows Server 2012 R2 не хватает временных портов, хотя это не должно

Мы регулярно испытываем странные проблемы с сетью на нашем выделенном сервере. Он работает под управлением Windows Server 2012 R2 x64 на Xeon E5620 с 16 ГБ ОЗУ и сетевым адаптером Intel 82575EB.

Обратите внимание, что мы уже настроены HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters ключевые значения TcpTimedWaitDelay а также MaxUserPort до 30 и 65530 соответственно.

В случайный момент времени наши сайты перестают отвечать, потому что они не могут подключиться к локальной базе данных. Это примерно 2 недели, когда эти проблемы начинают происходить. Системный журнал начинает получать предупреждения TCPIP 4227 и 4231. В нем говорится: "Запрос на выделение эфемерного номера порта из глобального пространства портов TCP не выполнен из-за использования всех таких портов".

Если я бегу

Get-Counter -Counter \TCPv4\*

или же

Get-Counter -Counter \TCPv6\*

или же

netstat -abn | find /c ":"

Я всегда получаю разумное значение 500-1500 соединений, которое даже близко не достигает 65К.

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

Может ли быть проблема с сетевым адаптером?

ОБНОВЛЕНИЕ 1

Это случилось снова и, казалось, было решено, когда я перезапустил почтовый сервер. Странно, однако, что все счетчики показывали ~1000 соединений с ~500 активными в данный момент, и все еще ошибка сокета 10055 при попытке соединиться с базой данных, которая не имеет никакого отношения к почтовому серверу.

ОБНОВЛЕНИЕ 2 Это странно, но ежедневный перезапуск почтовых служб решает проблему полностью.

4 ответа

У меня была похожая проблема с исчерпанным пулом портов 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-important.aspx

Была ли эта проблема в Windows Server 2016 при выполнении большого количества тестов Selenium с использованием chromewebdriver. Этот сценарий 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:12843 в ClientRequest. (\ Node_modules\ селен WebDriver\ HTTP \index.js:238:15)
От: Задача: WebDriver.quit()

В дополнение к настройкам драйвера 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 и выше.

Вы удостоверились, что не пропускаете объекты соединения с базой данных? Вы должны закрыть каждое открытое соединение с базой данных, либо явно (с помощью try-finally), либо с помощью блока { }. Это распространенная проблема, о которой ASP не скажет вам напрямую.

Другие вопросы по тегам