Решение проблемы с лимитом conntrack в Ubuntu 22.04.5 LTS
Очень коротенькая история, может кому-то тоже пригодится.
В общем, недавно вводили в эксплуатацию один сервис, построенный на базе Ubuntu 22.04.5 LTS
В какой-то момент обратили внимание, что есть всплески по conntrack и мы упираемся в потолок. Проявляется очень просто, не устанавливаются новые TCP сессии идущие через наш хост. В общем нужно увеличить количество возможных соединений.
Управляется это через параметр net.nf_conntrack_max, который по дефолту имеет значение 262144.
Сначала просто поменяли в рантайме через sysctl:
Соединения сразу выросли, но понятное дело, всё это живо только до ребута. Надо персистить.
Делается это через управление файликами *.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
Но, если вот в такой конструкции перезагрузить хост, то после запуска вы увидите опять всё те же значения 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
Всё, теперь система спокойно переживёт ребут и сможет единомоментно устанавливать до 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) ⭐️