В 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 не скажет вам напрямую.