TCP: too many orphaned sockets — Исправление утечки сокетов-сирот в Linux
Архитектура ошибки и симптомы сбоя
Сообщение «TCP: too many orphaned sockets» генерируется сетевым стеком ядра Linux. «Сокет-сирота» (Orphan Socket) — это TCP-соединение, которое больше не привязано ни к одному файловому дескриптору пользовательского процесса (например, веб-сервер закрыл соединение через close()), но ядро продолжает удерживать его для корректной передачи оставшихся данных или завершения процедуры закрытия (состояния FIN_WAIT_1, FIN_WAIT_2, CLOSING, LAST_ACK). Когда число таких сокетов превышает значение tcp_max_orphans, ядро принудительно сбрасывает (RST) новые соединения.
Диагностическая таблица параметров сбоя
| Параметр | Значение | Инженерный смысл сбоя |
|---|---|---|
| tcp_max_orphans | Integer (Лимит) | Максимально допустимое количество непривязанных к процессам TCP-сокетов. |
| Orphan Socket | FIN_WAIT_1 / LAST_ACK | Сокет в процессе закрытия, удерживаемый исключительно сетевым стеком ядра. |
| Penalty Action | TCP RST & Log Spam | Ядро немедленно разрывает соединение сбросом RST и пишет предупреждение в dmesg. |
Пошаговое дерево решений и сценарии траблшутинга
Сценарий 1: Анализ текущего количества orphaned-сокетов
# Просмотр статистики сокетов-сирот:
cat /proc/net/sockstat
# Ищите строку: TCP: inuse ... orphan <COUNT>
# Подсчет сокетов в фазах закрытия через ss:
ss -ant state fin-wait-1 or state fin-wait-2 or state last-ack | wc -lСценарий 2: Увеличение лимита tcp_max_orphans и ускорение закрытия FIN
Увеличьте лимит сокетов-сирот и сократите время удержания соединений в состоянии FIN-WAIT-2:
# Внесите правки в /etc/sysctl.d/99-tcp-orphans.conf:
cat <<EOF | sudo tee /etc/sysctl.d/99-tcp-orphans.conf
# Увеличение лимита orphaned-сокетов:
net.ipv4.tcp_max_orphans = 262144
# Сокращение времени ожидания FIN от удаленной стороны с 60 до 15 секунд:
net.ipv4.tcp_fin_timeout = 15
# Сокращение количества повторов пакетов FIN:
net.ipv4.tcp_orphan_retries = 2
EOF
sudo sysctl -p /etc/sysctl.d/99-tcp-orphans.confСценарий 3: Оптимизация тайм-аутов на стороне Web-сервера (Nginx / Apache)
# В /etc/nginx/nginx.conf настройте таймауты сброса неактивных клиентов:
keepalive_timeout 15s;
reset_timedout_connection on;
client_body_timeout 10s;
send_timeout 10s;Инженеры ITSTM настроят тонкий тюнинг сетевых таймаутов, оптимизируют конфигурации реверс-прокси и устранят зависания сетевых демонов.
Частые вопросы (FAQ)
Почему возникают сокеты-сироты (Orphan Sockets)?
Они возникают, когда приложение закрыло сокет со своей стороны (завершило работу с клиентом), но клиент в интернете медленно подтверждает прием данных или потерял связь, оставив соединение висеть на стороне ядра сервера.
Сколько памяти занимает каждый orphaned-сокет?
Каждый сокет-сирота потребляет до 64 КБ невыгружаемой физической памяти (в зависимости от размера wmem/rmem). Лимит tcp_max_orphans защищает сервер от исчерпания памяти при атаках медленными клиентами (Slowloris).
Помогает ли параметр net.ipv4.tcp_tw_reuse при ошибке orphaned sockets?
Параметр tcp_tw_reuse помогает повторно использовать сокеты в состоянии TIME_WAIT, но не влияет напрямую на orphaned-сокеты в состояниях FIN_WAIT_1 или LAST_ACK.
Что делает директива reset_timedout_connection on в Nginx?
Она заставляет Nginx принудительно закрывать зависшие по таймауту клиентские сокеты отправкой пакета TCP RST с немедленным обнулением структур сокета в ядре, не дожидаясь длительного цикла FIN-ACK.