No buffer space available в журнале службы
Сообщение No buffer space available (номер 105, ENOBUFS) означает, что ядру не хватило буферов для операции. У служб это обычно сеть: переполнение таблицы соседей, исчерпание буферов сокетов или памяти под сетевые структуры.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Переполнена таблица соседей
При большом числе соседей в сети таблица заполняется, и новые записи не создаются. Признак — сообщения ядра о переполнении.
-
Исчерпаны буферы сокетов
При большом числе соединений или крупных буферах память под них заканчивается.
-
Нехватка памяти ядра
При общей нехватке памяти ядро не может выделить буферы. Тогда эта ошибка — следствие, а не причина.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Таблица соседей и статистика.
ip -s neigh show | tailИспользование памяти сокетами.
cat /proc/net/sockstatСообщения ядра.
journalctl -k -b --no-pager | grep -iE "neighbour table overflow|No buffer" | tailРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- При большом числе соседей в сети таблица заполняется, и новые записи не создаются. Признак — сообщения ядра о переполнении.
- Как проверить
-
Посмотрите таблицу и пределы.
ip -s neigh show | tail -5 sysctl net.ipv4.neigh.default.gc_thresh3
- Как исправить
- Увеличьте пределы таблицы соседей через настройки ядра. В больших плоских сетях это обычная необходимость.
- Почему происходит
- При большом числе соединений или крупных буферах память под них заканчивается.
- Как проверить
-
Посмотрите использование памяти сокетов.
ss -m | head -20 cat /proc/net/sockstat
- Как исправить
- Уменьшите размеры буферов у службы или увеличьте общий предел памяти для сокетов в настройках ядра.
- Почему происходит
- При общей нехватке памяти ядро не может выделить буферы. Тогда эта ошибка — следствие, а не причина.
- Как проверить
-
Посмотрите память и сообщения ядра.
free -h journalctl -k -b --no-pager | tail -10
- Как исправить
- Разбирайтесь с нехваткой памяти: освободите её или ограничьте потребителя.
Пример вывода
Переполнена таблица соседей. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
kernel: neighbour: arp_cache: neighbor table overflow!
myapp[1200]: error: sendto: no buffer space available
Связанные ошибки
- nf_conntrack: table full, dropping packet Соединения обрываются под нагрузкой: заполнена таблица отслеживания соединений ядра.
- Cannot allocate memory в журнале службы Не удалось выделить память: предел службы, память машины, настройка overcommit, исчерпанные области отображения.
- Network is unreachable в журнале службы Сеть недостижима: нет маршрута, интерфейс не поднят, отключён IPv6 при попытке им воспользоваться.
- TCP: out of memory -- consider tuning tcp_mem Ядру не хватает памяти под сетевые буферы: соединения рвутся, служба отвечает с перебоями.
- Elasticsearch: max virtual memory areas vm.max_map_count is too low Elasticsearch отказывается стартовать из-за заниженного vm.max_map_count. Как поднять значение и закрепить его.
- VFS: file-max limit reached: в системе кончились описатели Общесистемный предел числа открытых файлов исчерпан: службы перестают принимать соединения и открывать файлы.
- kernel: TCP: request_sock … overflow Соединения теряются при наплыве: переполнена очередь ожидающих соединений. Как считать somaxconn и backlog.
- kernel: audit: backlog limit exceeded Очередь аудита переполнена: часть событий теряется, система может замедляться.
Источники
- Документация ядра: настройки сети
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено заполнением таблицы соседей в тестовой сети.