16.08.2015

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

Ошибка «An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full»

Проблема

При длительной работе без перезагрузки сервера, на котором размещен кластер "1С:Предприятия", может наблюдаться проблема, сопровождающаяся следующими симптомами:

При этом в технологическом журнале регистрируется следующая ошибка:

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

либо ошибка (если используется русская версия операционной системы):

«Операция с сокетом не может быть выполнена из-за недостатка места в системном буфере или из-за переполнения очереди»

После перезагрузки сервера, на котором размещен кластер 1С:Предприятия, ошибка временно пропадает. Затем через некоторый промежуток времени проблема возобновляется.

Причина

При открытии большого количества TCP-соединений есть вероятность того, что в операционной системе будут выбраны все доступные динамические порты.

По умолчанию в Windows в качестве динамических доступны порты в диапазоне 1024-5000.

Но использовать умолчательное значение не очень хорошо, т.к. необходимо обеспечить непересечение динамического диапазона портов с портами процессов 1С:Предприятие на этом сервере.

Решение

Для устранения проблемы необходимо увеличить количество доступных динамических портов на сервере, на котором расположен кластер серверов 1С:Предприятия.

Windows 2003

В ключе реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters добавьте следующий параметр:

После выполнения настройки произведите перезапуск сервера.

Windows 2008 и старше

  1. В ключе реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters добавьте следующие параметры:
  2. Выполните настройку стека TCP/IP с помощью интерпретатора командной строки (cmd):
     netsh int ipv4 set dynamicport tcp start=10000 num=64510
     netsh int ipv4 set dynamicport udp start=10000 num=64510
     netsh int ipv6 set dynamicport tcp start=10000 num=64510
     netsh int ipv6 set dynamicport udp start=10000 num=64510

После выполнения настройки произведите перезагрузку сервера.

При необходимости start указать меньше 10000 требуется проследить, что задаваемый диапазон портов не пересекается с портами процессов 1С:Предприятие на этом сервере.

Linux

net.ipv4.netfilter.ip_conntrack_max = 1048576

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

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