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

В 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 Это странно, но ежедневный перезапуск почтовых служб полностью решает проблему.

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

В дополнение к настройкам драйвера Tcpip, диапазон эфемерных TCP-портов управляется в Windows Server с помощью сетка команда (источник).

Ты можешь Посмотреть динамический диапазон портов с помощью следующих команд:

  • 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 число =16384) также является дефолт на Windows Server 2008 и новее.

Была такая же проблема на 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 \ selenium-webdriver \ http \ index.js: 238: 15)
Из: Задача: WebDriver.quit ()

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