5

Мои приложения ASP.NET и SQL Server 2012 работают на Windows Server 2008 R2. Внезапно мой интернет на сервере перестал работать, и мое приложение начало работать,

An operation on a socket could not be performed because the system lacked sufficient buffer 
space or because a queue was full

Запуск netstat показывает, что PID = 0, открывая много портов. Netstat говорит это,

Process Id = 0, State = TIME_WAIT have 130,053 ports open
Process Id = 38840, State = CLOSE_WAIT have 5 ports open
Process Id = Any, State = LISTENING have 30 ports open
Process Id = Any, State = ESTABLISHED have 10 ports open

Статистика 22 декабря 2015 г.

CLOSE_WAIT  5   
ESTABLISHED 146
TIME_WAIT   646750
LAST_ACK    1
LISTENING   30

2 ответа2

7

Вы используете веб-сервер, к которому обращаются браузеры с нескольких мобильных устройств.

Из-за того, как работает TCP/IP, соединения не могут быть закрыты немедленно. Пакеты могут поступить не по порядку или быть повторно переданными после закрытия соединения. CLOSE_WAIT указывает, что удаленная конечная точка (другая сторона соединения) закрыла соединение. TIME_WAIT указывает, что локальная конечная точка (эта сторона) закрыла соединение. Соединение поддерживается так, что любые задержанные пакеты могут быть сопоставлены с соединением и обработаны соответствующим образом. Соединения будут удалены по истечении времени ожидания по умолчанию в течение четырех минут.

Тем не менее число рядом с вашей статистикой TIME_WAIT, 646750, является чрезмерным. Это означает, что за последние 4 минуты было закрыто 646750 соединений, что составляет 2694 в секунду! Очевидно, что некоторые из этих мобильных устройств сильно неисправны и бомбардируют ваш сервер соединениями, которые не закрываются должным образом со стороны клиента, или что вы обслуживаете огромное количество клиентов (что не имеет смысла для одного сервера).

Если вы не можете определить, какие мобильные устройства или приложения являются причиной проблемы, и устранить их, вы не контролируете клиентскую сторону и можете только устранить проблему на стороне сервера.

Одним из параметров, который может улучшить эту перегрузку, является TcpTimedWaitDelay, описываемый как:

Определяет время, которое должно пройти, прежде чем TCP сможет освободить закрытое соединение и повторно использовать свои ресурсы. Этот интервал между закрытием и освобождением известен как состояние TIME_WAIT или состояние 2MSL. В течение этого времени соединение может быть восстановлено с гораздо меньшими затратами для клиента и сервера, чем установление нового соединения.

Уменьшение значения этой записи позволяет TCP быстрее освобождать закрытые соединения, предоставляя больше ресурсов для новых соединений. Однако, если значение слишком мало, TCP может освободить ресурсы подключения до завершения подключения, что потребует от сервера использования дополнительных ресурсов для восстановления подключения.

TcpTimedWaitDelay можно изменить с помощью regedit по адресу HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters . Он содержит количество секунд ожидания. Значение по умолчанию составляет 240 секунд (4 минуты). Перезагрузка требуется при изменении.

Например, изменение на 30 секунд с 2694 соединениями в секунду будет означать, что только 80820 соединений будут ожидать закрытия. Это число все еще огромно, но изменение все равно уменьшит использование ресурсов соединения.

-1

Тот же вопрос здесь: https://serverfault.com/questions/661476/getting-an-operation-on-a-socket-could-not-be-performed-because-the-system-lack/

Это проблема подключения к Windows Max. Некоторые КБ говорят, что нужно изменить максимальный временный порт или добавить память:/

http://blogs.msdn.com/b/sql_protocols/archive/2009/03/09/understanding-the-error-an-operation-on-a-socket-could-not-be-performed-because-the- системы не было самодостаточный-буфер или пространственно-потому-A-очередь был-full.aspx

Я видел эту проблему на физическом сервере с очень большим временем безотказной работы (8+ месяцев), перезагрузка решила проблему ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .