Знакомая ситуация: приложение держит постоянное TCP-соединение (к БД, API, брокеру), все работает… а потом внезапно «connection reset» или таймаут. Особенно часто это происходит через 5–30 минут простоя. Причина обычно не в приложении, а в сети.
🤩 Что происходит
Между клиентом и сервером почти всегда есть:
NAT
firewall
балансировщик
облачный LB
Эти устройства хранят таблицы состояний соединений. Если трафика нет - запись удаляется. Со стороны приложения соединение живое, но по факту его уже нет.
▪️ Где здесь TCP keepalive
TCP keepalive - это механизм, при котором стек TCP периодически отправляет служебные пакеты, чтобы подтвердить, что соединение ещё активно.
По умолчанию в Linux:
tcp_keepalive_time = 7200 (2 часа!)
tcp_keepalive_intvl = 75
tcp_keepalive_probes = 9
Для современных инфраструктур это слишком долго - NAT обычно живет 300–900 секунд.
▪️ Как чинить
1️⃣ Включить keepalive в приложении (многие драйверы БД и HTTP-клиенты это поддерживают).
2️⃣ Настроить параметры в системе:
sysctl -w net.ipv4.tcp_keepalive_time=300
sysctl -w net.ipv4.tcp_keepalive_intvl=30
sysctl -w net.ipv4.tcp_keepalive_probes=5
Теперь проверка пойдет через 5 минут простоя, а не через 2 часа.
3️⃣ Учитывать таймауты балансировщиков (например, в облаке они могут быть 350 секунд).
#linux #networking
🧑💻 NetworkAdmin