Ошибка 0x00002747: An operation on a socket could not be performed because the system lacked sufficient buffer space
Добрый день! Уважаемые читатели и гости IT блога Pyatilistnik.org🍀. В прошлый раз мы с вами устраняли ошибку "0x00002740: only one usage of each socket address" на сервере 1С, тогда у нас были заняты все сокеты в системе. Сегодня я опять столкнулся с ошибкой 1С сервера, при попытке обратиться к конфигуратору я получил ошибку "An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full". Давайте я покажу, как я выкрутился и на будущее избавился от данной ошибки.
Описание ошибки 1С
Обратился ко мне разработчик, что на одном из его 1С серверов вылетела ошибка:
В логах сбойного сервера я обнаружил вот такие предупреждения.
Симптомы ошибки 0x00002747
При длительной работе без перезагрузки сервера, на котором размещен кластер "1С:Предприятия", может наблюдаться проблема, сопровождающаяся следующими симптомами:
- ✅Пользователи не могут подключиться к информационным базам, опубликованным в кластере серверов 1С:Предприятия;
- ✅К кластеру серверов 1С:Предприятия невозможно подключиться через консоль администрирования;
- ✅К серверу, на котором размещен кластер 1С:Предприятия невозможно подключиться терминально;
- ✅Помогает только перезапуск ОС, но не помогает перезапуск службы (Точнее перезапуск может помочь, но не сразу, а в течение 4 и более минут).
Решение проблемы
Ошибка "An operation on a socket could not be performed because the system lacked sufficient buffer space" происходит по тому, что операционная система исчерпывает динамические порты TCP. Максимальное число временных TCP-портов по умолчанию — 5000 в продуктах, включенных в раздел "Область действия". В эти продукты добавлен новый параметр. Вы увеличить максимальное количество временных портов, выполните описанные ниже действия.
В соответствии с рекомендациями IANA корпорация Майкрософт увеличила диапазон динамических портов клиента для исходящих подключений в Windows Vista и Windows Server 2008. Новый начальный порт по умолчанию — 49152, а новый конечный порт по умолчанию — 65535. Это изменение конфигурации более ранних версий Windows, в которых использовался диапазон портов по умолчанию от 1025 до 5000. Но и эти 16 000 портов можно легко исчерпать.
Чтобы посмотреть количество динамических портов в вашей системе, вам нужно выполнить:
- ✅netsh int ipv4 show dynamicport tcp
- ✅netsh int ipv4 show dynamicport udp
- ✅netsh int ipv6 show dynamicport tcp
- ✅netsh int ipv6 show dynamicport udp
На сбойном сервере у меня диапазон оказался не таким уж и большим с 1025 по 8976:
Чтобы добавить динамических портов, вы можете пойти двумя путями:
- 1️⃣Это создать ключ реестра тип DWORD и именем MaxUserPort по пути:
Значение в decimal может быть до 65534, у меня тут стояло 7 951. Я выставил для теста 27000
В результате количество динамических портов увеличилось.
Теперь создайте тут же ключ REG_DWORD с именем TcpTimedWaitDelay. По умолчанию TcpTimedWaitDelay равен 240 секунд. Он определяет время, которое должно пройти, прежде чем TCP сможет разорвать закрытое соединение и повторно использовать свои ресурсы. Этот интервал между закрытием и выпуском известен как состояние TIME_WAIT или состояние 2MSL. В течение этого времени соединение может быть повторно открыто с гораздо меньшими затратами для клиента и сервера, чем установка нового соединения.
RFC 793 требует, чтобы TCP поддерживал закрытое соединение в течение интервала, по крайней мере, равного удвоенному максимальному времени жизни сегмента (2MSL) сети. Когда соединение освобождается, его пара сокетов и блок управления TCP (TCB) могут использоваться для поддержки другого соединения. По умолчанию MSL определяется равным 120 секундам, а значение этой записи равно двум MSL или 4 минутам. Однако вы можете использовать эту запись для настройки интервала.
Уменьшение значения этой записи позволяет TCP быстрее освобождать закрытые соединения, предоставляя больше ресурсов для новых соединений. Однако, если значение слишком низкое, TCP может высвободить ресурсы соединения до того, как соединение будет установлено, что потребует от сервера использования дополнительных ресурсов для повторного установления соединения.
Я выставлю для TcpTimedWaitDelay 45 секунд.
- 2️⃣Второй вариант для тех, кто не хочет лазить по реестру и создавать ключи. Откройте командную строку от имени администратора и введите:
Следующие команды по необходимости:
netsh int ipv4 set dynamicport udp start=2000 num=63000 (Сделает по сути использование udp портов от 2000 по 65000, плюс создаст ключ реестра MaxUserPort)
netsh int ipv6 set dynamicport tcp start=2000 num=63000 (Сделает по сути использование ipv6 tcp портов от 2000 по 65000, плюс создаст ключ реестра MaxUserPort)
netsh int ipv6 set dynamicport udp start=2000 num=63000 (Сделает по сути использование ipv6 udp портов от 2000 по 65000, плюс создаст ключ реестра MaxUserPort)
Эти примеры команд задают динамический диапазон портов, который должен начинаться с порта 2000 и до порта 35000 (33000 портов). Минимальный диапазон портов, который можно задать, — 255. Минимальный начальный порт, который можно задать, — 1025. Максимальный конечный порт (в зависимости от заданного диапазона) не может превышать 65535.
Linux
Максимальное количество соединений для работы механизма connection tracking (используется, например, iptables). При слишком маленьких значениях ядро начинает отвергать входящие подключения с соответствующей записью в системном логе.
Небольшой траблшутинг
Еще я замечал, что проблемой по которой вы моете видеть ошибку "Операция над сокетом не может быть выполнена из-за того, что в системе недостаточно места в буфере или из-за того, что очередь переполнена" это некорректная работа антивируса Касперского, который легко может либо сам забирать кучу динамических портов, либо их блокировать. В таких случаях помогает перезапуск службы. Еще у меня изначально на сервере был установлен Kaspersky Security for Windows Server, я советую переустановить его на KES, сам вендор так советует.
На этом у меня все. Надеюсь, что вы смогли отремонтировать ваш сервер 1С. С вами был Иван Сёмин, автор и создатель IT портала Pyatilistnik.org,
Дополнительно
- https://learn.microsoft.com/ru-ru/archive/blogs/sql_protocols/understanding-the-error-an-operation-on-a-socket-could-not-be-performed-because-the-system-lacked-sufficient-buffer-space-or-because-a-queue-was-full
- https://learn.microsoft.com/ru-RU/troubleshoot/windows-server/networking/default-dynamic-port-range-tcpip-chang
- https://learn.microsoft.com/ru-RU/troubleshoot/windows-client/networking/connect-tcp-greater-than-5000-error-wsaenobufs-10055
- https://theregime.wordpress.com/2013/12/03/event-id-4227/
- https://borncity.com/win/2016/12/20/events-id-4231-and-4227-tcpip-no-internet-connection/
- https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-2000-server/cc938217(v=technet.10)?redirectedfrom=MSDN
- https://kb.vmware.com/s/article/2075305