Ошибка 0x00002747: An operation on a socket could not be performed because the system lacked sufficient buffer space

Обновлено 15.08.2023

error icon

Добрый день! Уважаемые читатели и гости 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: An operation on a socket could not be performed because the system lacked sufficient buffer space (В русском варианте: Операция над сокетом не может быть выполнена из-за того, что в системе недостаточно места в буфере или из-за того, что очередь переполнена.)

0x00002747: An operation on a socket could not be performed because the system lacked sufficient buffer space

В данный момент вход в приложение невозможен, попробуйте позже

В данный момент вход в приложение невозможен

В логах сбойного сервера я обнаружил вот такие предупреждения.

ID 4231: A request to allocate an ephemeral port number from the global TCP port space has failed due to all such ports being in use

A request to allocate an ephemeral port number from the global TCP port space has failed due to all such ports being in use

ID 4227: TCP/IP failed to establish an outgoing connection because the selected local endpoint was recently used to connect to the same remote endpoint. This error typically occurs when outgoing connections are opened and closed at a high rate, causing all available local ports to be used and forcing TCP/IP to reuse a local port for an outgoing connection. To minimize the risk of data corruption, the TCP/IP standard requires a minimum time period to elapse between successive connections from a given local endpoint to a given remote endpoint.

ID 4227: TCP/IP failed to establish an outgoing connection because the selected local endpoint was recently used to connect to the same remote endpoint

ID 4231:

ID 4231

Симптомы ошибки 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:

netsh int ipv4 show dynamicport tcp

Диапазон задается отдельно для каждого транспорта (TCP или UDP). Диапазон портов теперь действительно является диапазоном, который имеет начальную и конечную точки.

Чтобы добавить динамических портов, вы можете пойти двумя путями:

  • 1️⃣Это создать ключ реестра тип DWORD и именем MaxUserPort по пути:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet \Services\Tcpip\Parameters

Значение в decimal может быть до 65534, у меня тут стояло 7 951. Я выставил для теста 27000

MaxUserPort

В результате количество динамических портов увеличилось.

Количество динамических портов

Не забудьте только исключить диапазон портов 1С

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

RFC 793 требует, чтобы TCP поддерживал закрытое соединение в течение интервала, по крайней мере, равного удвоенному максимальному времени жизни сегмента (2MSL) сети. Когда соединение освобождается, его пара сокетов и блок управления TCP (TCB) могут использоваться для поддержки другого соединения. По умолчанию MSL определяется равным 120 секундам, а значение этой записи равно двум MSL или 4 минутам. Однако вы можете использовать эту запись для настройки интервала.

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

Обычно TCP не освобождает закрытые соединения, пока не истечет значение этой записи. Однако TCP может разъединять соединения до того, как истечет это значение, если он исчерпал блоки управления TCP (TCB). Количество создаваемых системой TCB определяется значением записи MaxFreeTcbs.

Я выставлю для TcpTimedWaitDelay 45 секунд.

TcpTimedWaitDelay

netsh int ipv4 set dynamicport tcp start=2000 num=63000 (Сделает по сути использование tcp портов от 2000 по 65000, плюс создаст ключ реестра MaxUserPort)

Следующие команды по необходимости:
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)

увеличение динамических портов через cmd

Эти примеры команд задают динамический диапазон портов, который должен начинаться с порта 2000 и до порта 35000 (33000 портов). Минимальный диапазон портов, который можно задать, — 255. Минимальный начальный порт, который можно задать, — 1025. Максимальный конечный порт (в зависимости от заданного диапазона) не может превышать 65535.

В идеале еще перезагрузить сервер

Linux

net.ipv4.netfilter.ip_conntrack_max = 1048576

Максимальное количество соединений для работы механизма connection tracking (используется, например, iptables). При слишком маленьких значениях ядро начинает отвергать входящие подключения с соответствующей записью в системном логе.

sysctl -w net.ipv4.netfilter.ip_conntrack_max=1048576

Небольшой траблшутинг

Еще я замечал, что проблемой по которой вы моете видеть ошибку "Операция над сокетом не может быть выполнена из-за того, что в системе недостаточно места в буфере или из-за того, что очередь переполнена" это некорректная работа антивируса Касперского, который легко может либо сам забирать кучу динамических портов, либо их блокировать. В таких случаях помогает перезапуск службы. Еще у меня изначально на сервере был установлен Kaspersky Security for Windows Server, я советую переустановить его на KES, сам вендор так советует.

Get-Service KAVFS | Restart-Service

Перезапуск Kaspersky Security for Windows Server

На этом у меня все. Надеюсь, что вы смогли отремонтировать ваш сервер 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
Автор - Сёмин Иван

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *