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

CamaroSS
источник
1
У меня была похожая проблема, и следующая ссылка исправила ее для меня: http://blogs.technet.com/b/kimberj/archive/2012/07/06/sever-quot-hangs-quot-and-ephemeral-port- исчерпание-questions.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-important.aspx

Myke
источник
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 и более поздних версиях.

rustyx
источник
Большое вам спасибо за это - я уже часами пытался решить мою проблему. Все советы, которые я мог найти, касались настройки MaxUserPort в реестре, и никто не упомянул netsh.
Милош
3

Эта же проблема на 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 ()

SliverNinja - MSFT
источник
1

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

Джеймс
источник
Это группа PHP-сайтов, большинство из которых работают через FastCGI, используя постоянное соединение, поэтому это не должно быть так. Если это так, то системные счетчики будут возвращать более высокие значения. Я также не могу объяснить, почему localhost внезапно останавливается для разрешения в :: 1 и вместо этого разрешается в 127.0.0.1.
CamaroSS
2
Исчезновение 1, вероятно, является лишь побочным эффектом переполнения допустимых портов - я подозреваю, что windows пытается выполнить эхо-запрос IPv6, и когда ему не удается получить порт для попытки, он возвращается к IPv4. PHP выходит за рамки моей компетенции. :-(. Удачи!
Джеймс