Одно из моих .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.