Уяви: сервер працює роками, і тут під навантаженням починає губити з’єднання - то сайт не відкрився, то NAT підвис. А процесор вільний, пам’ять є, у логах додатку пусто. Дуже часто винуватець один - переповнена таблиця conntrack.
Що це взагалі таке?#
Netfilter (той самий, що за iptables/nftables) вміє стежити за з’єднаннями - щоб розуміти, що оцей пакет належить уже відкритій сесії, а не прилетів з нізвідки. Це зветься connection tracking, скорочено conntrack. Кожне відстежуване з’єднання - окремий рядок у таблиці всередині ядра.
nf_conntrack_max - це максимальна кількість таких рядків. Коли вони закінчуються, ядру нема куди записати нове з’єднання, і воно просто викидає пакет, лишаючи в dmesg класику:
| |
Ось це і є та сама «незрозуміла» втрата з’єднань на рівному місці.
Модуль nf_conntrack вмикається сам, щойно ти користуєшся NAT або stateful-правилами. На звичайному десктопі його може й не бути; на роутері, шлюзі, реверс-проксі чи балансувальнику - майже завжди.
Як перевірити#
Межа і скільки зараз зайнято:
| |
Якщо count підкрадається до max - час бити на сполох. Той самий максимум можна глянути й через sysctl:
| |
Детальніше - утилітою conntrack (пакет conntrack):
| |
Рядок drop у conntrack -S - це пакети, які вже загубились через переповнення. Якщо він росте - діагноз підтверджено.
На що це впливає#
- Роутери, NAT-шлюзи, балансувальники, проксі - там тисячі одночасних з’єднань, і таблиця переповнюється найлегше. На домашньому ПК про conntrack можна й не згадувати.
- Переповнення = втрата пакетів. Не гальмування, а саме мовчазні обриви нових з’єднань, поки старі не звільнять місце. Тому й ловиться важко.
- Пам’ять. Кожен запис займає ~300 байт. Мільйон з’єднань - це вже сотні мегабайт у ядрі, тож задирати
maxу космос «про всяк випадок» не варто. - Таймаути. Записи висять ще довго після закриття сесії (established TCP за замовчуванням тримається аж 5 днів), тож таблиця буває повна навіть при помірному трафіку.
Як збільшити#
Наживо, до перезавантаження:
| |
Щоб лишилось назавжди - у /etc/sysctl.d/99-conntrack.conf (або в /etc/sysctl.conf):
| |
І застосувати:
| |
Для дуже навантажених систем варто підняти ще й розмір хеш-таблиці, щоб пошук по ній лишався швидким:
| |
Орієнтир простий: тримай
nf_conntrack_countпомітно нижче заmax, поглядай на лічильникdrop- і сервер перестане «мовчки» губити з’єднання.



