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

Параметр MaxUserPort игнорируется

Одно из моих .NET-приложений получает следующее исключение при запуске ~ 300 HTTP-запросов в течение примерно 1 минуты:

System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted

Единственный совет, который я смог найти по этому поводу, - отрегулировать MaxUserPort настройка в реестре под HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters.

Хотя я установил для этого параметра максимально возможное значение, исключение все равно возникает.

Оказалось, что есть еще один способ установить лимит максимального количества открытых портов с помощью netsh служба.

Вы можете проверить текущее значение с помощью:

netsh int ipv4 show dynamicport tcp

В моем случае он был установлен на 256. Вы можете легко изменить его с помощью:

netsh int ipv4 set dynamic tcp start=45000 num=10000

Перезагрузка не требуется.

Причина этой проблемы в том, что даже при правильной утилизации HttpClient объекты в .NET, сокеты все еще остаются в TIME_WAIT состояние на некоторое время. Таким образом, даже несмотря на то, что соединения были последовательными, ограничение все равно оставалось актуальным.

По умолчанию порты TCP не закрываются сразу и остаются в состоянии TIME_WAIT в течение 120 секунд.

Уменьшение этого параметра TcpTimedWaitDelay до 30 секунд и установив StrictTimeWaitSeqCheck значение 1 может улучшить производительность TCP.

https://support.solarwinds.com/SuccessCenter/s/article/Tweaking-Windows-Server-performance-to-prevent-port-exhauration-when-using-Orion-modules