kernel: TCP: request_sock … overflow
Очередь ожидающих соединений имеет предел: он задаётся и системной настройкой, и параметром самой службы. При наплыве очередь переполняется, и часть соединений теряется — клиенты видят таймауты.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Системный предел очереди мал
Настройка ядра ограничивает очередь независимо от того, что просит служба. Служба не может превысить этот предел.
-
Служба просит малую очередь
Даже при высоком системном пределе служба может запросить короткую очередь в своих настройках.
-
Служба не успевает принимать соединения
Очередь переполняется не из-за размера, а из-за того, что обработчики заняты. Увеличение очереди лишь отсрочит потери.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Системные пределы очередей.
sysctl net.core.somaxconn net.ipv4.tcp_max_syn_backlogСколько соединений ожидает подтверждения.
ss -tan state syn-recv | wc -lСообщения ядра о переполнении.
journalctl -k -b --no-pager | grep -iE "request_sock|SYN flood" | tailРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Настройка ядра ограничивает очередь независимо от того, что просит служба. Служба не может превысить этот предел.
- Как проверить
-
Посмотрите предел и переполнения.
sysctl net.core.somaxconn netstat -s 2>/dev/null | grep -i "listen queue" || ss -s | head
- Как исправить
-
Поднимите предел через файл настроек ядра и перезапустите службу: очередь задаётся при открытии сокета.
echo "net.core.somaxconn = 4096" | sudo tee /etc/sysctl.d/99-net.conf && sudo sysctl --system
- Почему происходит
- Даже при высоком системном пределе служба может запросить короткую очередь в своих настройках.
- Как проверить
-
Посмотрите настройку службы.
sudo nginx -T 2>/dev/null | grep -i backlog systemctl show myapp.socket -p Backlog 2>/dev/null
- Как исправить
-
Увеличьте очередь в настройках службы. Для сокет-активации это параметр
Backlog=в описании сокета.
- Почему происходит
- Очередь переполняется не из-за размера, а из-за того, что обработчики заняты. Увеличение очереди лишь отсрочит потери.
- Как проверить
-
Посмотрите состояния соединений и загрузку службы.
ss -tan state syn-recv | wc -l systemctl status myapp.service --no-pager | grep -i tasks
- Как исправить
- Разбирайтесь с производительностью: добавьте обработчиков или ускорьте обработку запроса.
Пример вывода
Очередь ожидающих соединений переполнена. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
kernel: TCP: request_sock_TCP: Possible SYN flooding on port 443. Sending cookies. Check SNMP counters.
nginx[1120]: [error] accept4() failed (11: Resource temporarily unavailable)
Связанные ошибки
- Connection timed out в журнале службы Соединение не устанавливается по таймауту: пакеты отбрасываются, узел недоступен, перегружен сервер на другой стороне.
- nginx: worker_connections are not enough nginx под нагрузкой: не хватает соединений на рабочий процесс. Как считать worker_connections вместе с LimitNOFILE.
- nf_conntrack: table full, dropping packet Соединения обрываются под нагрузкой: заполнена таблица отслеживания соединений ядра.
- No buffer space available в журнале службы Ошибка 105: нет места в буферах ядра. Разбор для сети и таблиц соседей.
- TCP: out of memory -- consider tuning tcp_mem Ядру не хватает памяти под сетевые буферы: соединения рвутся, служба отвечает с перебоями.
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Automount: каталог монтируется не вовремя или отваливается Автомонтирование через .automount: как работает TimeoutIdleSec, почему ресурс отваливается и когда лучше обычный .mount.
- Broken pipe в журнале службы Запись в закрытый канал или соединение: клиент отключился, обработчик завершился, конвейер разорван.
Где встречается чаще всего
Источники
- Документация ядра: настройки сети
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено нагрузкой при somaxconn=128.