February 5

Решение проблемы с лимитом conntrack в Ubuntu 22.04.5 LTS

Очень коротенькая история, может кому-то тоже пригодится.

В общем, недавно вводили в эксплуатацию один сервис, построенный на базе Ubuntu 22.04.5 LTS

В какой-то момент обратили внимание, что есть всплески по conntrack и мы упираемся в потолок. Проявляется очень просто, не устанавливаются новые TCP сессии идущие через наш хост. В общем нужно увеличить количество возможных соединений.

Управляется это через параметр net.nf_conntrack_max, который по дефолту имеет значение 262144.

Сначала просто поменяли в рантайме через sysctl:

sysctl net.netfilter.nf_conntrack_max 4194304

проверяем: sysctl net.netfilter.nf_conntrack_max

Соединения сразу выросли, но понятное дело, всё это живо только до ребута. Надо персистить.
Делается это через управление файликами *.conf внутри /etc/sysctl.d/, то есть создаёте новый и туда прописываете нужные параметры, они при запуске системы будут считываться sysctl и всё будет корректно настраиваться:

cd /etc/sysctl.d/ touch 99-nf_conntrack.conf ### это необязательно, для наглядности добавил echo "net.nf_conntrack_max = 4194304 " >> /etc/sysctl.d/99-nf_conntrack.conf

cat 99-nf_conntrack.conf net.nf_conntrack_max = 4194304

Но, если вот в такой конструкции перезагрузить хост, то после запуска вы увидите опять всё те же значения conntrack, которые были по дефолту - 262144.

Если посмотреть логи, то внутри будет ошибка, что файл не найден:

root@hostname:/etc/sysctl.d# systemctl status systemd-sysctl ● systemd-sysctl.service - Apply Kernel Variables Loaded: loaded (/lib/systemd/system/systemd-sysctl.service; static) Active: active (exited) since Tue 2025-12-16 10:00:25 UTC; 1h 18min ago Docs: man:systemd-sysctl.service(8) man:sysctl.d(5) Main PID: 1880 (code=exited, status=0/SUCCESS) CPU: 6ms

Dec 16 10:00:25 hostname systemd-sysctl[1880]: Couldn't write '4194304' to 'net/netfilter/nf_conntrack_max', ignoring: No such file or directory

Спустя какое-то время, я догадался что это происходит по той причине, что модуль nf_conntrack загружается ПОСЛЕ того, как sysctl настраивает систему, ну и собственно поэтому последний не может его настроить.
Отсюда делаем вывод, что надо nf_conntrack загружать ДО того как sysctl начнёт настраивать.

Делается это через вот этот конфиг файл - /etc/modules-load.d/modules.conf:

echo nf_conntrack >> /etc/modules-load.d/modules.conf

cat /etc/modules-load.d/modules.conf # /etc/modules: kernel modules to load at boot time. # # This file contains the names of kernel modules that should be loaded # at boot time, one per line. Lines beginning with "#" are ignored. nf_conntrack

Теперь после перезагрузки хост поднимается сразу с корректными параметрами conntrack.

Последнее, что нужно сделать - это отредактировать параметр hashsize для наших соединений. Собственно размер этого хеша, напрямую влияет на скорость поиска внутри и соответственно нагрузку на CPU. Есть рекомендация выставлять размер hashsize в соответствии с правилом max_conntrack/8, что в моём случае равняется 524288.

Для этого выставляем нужное значение в файле /sys/module/nf_conntrack/parameters/hashsize

echo 524288 > /sys/module/nf_conntrack/parameters/hashsize

cat /sys/module/nf_conntrack/parameters/hashsize 524288

Всё, теперь система спокойно переживёт ребут и сможет единомоментно устанавливать до 4млн сессий.

Немного ссылок:
https://www.kernel.org/doc/Documentation/networking/nf_conntrack-sysctl.txt
https://manpages.debian.org/unstable/conntrackd/conntrackd.conf.5.en.html


Подписаться на канал (https://t.me/like_a_bus_channel) ⭐️