У меня есть узел в нашем кластере, который получает много сообщений «nf_conntrack: table full, droping packet» в системном журнале. Я проверил nf_conntrack_count, и он работал прямо с nf_conntrack_max. Заглянув в таблицу, я увидел, что большинство записей были DNS-запросами, поэтому я добавил эти правила в "исходную" таблицу netfilter.
$ sudo iptables -t raw -vnL
Chain PREROUTING (policy ACCEPT 146M packets, 19G bytes)
pkts bytes target prot opt in out source destination
33M 4144M CT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp spt:53 CT notrack
33M 2805M CT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:53 CT notrack
Chain OUTPUT (policy ACCEPT 73M packets, 8311M bytes)
pkts bytes target prot opt in out source destination
10785 882K CT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:53 CT notrack
0 0 CT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp spt:53 CT notrack
Это оставило счетчик около 13000 или около того, а nf_conntrack_max установлен на 65535. Однако я все еще получаю сообщения об отброшенных пакетах. Большинство остальных пакетов - UDP, и я установил nf_conntrack_udp_timeout равным 1 секунде, оставив nf_conntrack_count около 1000. Однако я все равно получаю сброшенное упакованное сообщение.
Отсюда, если я увеличу максимальное значение, он остановит отброшенные пакетные сообщения, однако я не понимаю, почему это необходимо.
Я запускаю докер, и есть контейнер elasticsearch (похоже, эта проблема возникает на любом узле, на котором выполняется elasticsearch). Не уверен, актуально ли это, но у узла 48 ядер.
$ uname -a
Linux qtausc-pphd0128 3.19.0-26-generic #28~14.04.1-Ubuntu SMP Wed Aug 12 14:09:17 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
Так почему же он отбрасывает пакеты, если их количество намного меньше максимального?
Некоторое время назад у меня была такая же проблема в системе Squid.
Один из наиболее эффективных способов уменьшить размер conntrack - это уменьшить тайм-аут TCP по умолчанию в ядре.
В net.netfilter.nf_conntrack_tcp_timeout_established
по умолчанию установлено значение 432000. Правильно ... это 5 дней.
Чтобы установить значение, вы можете выполнить следующую команду;
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=X
И если вы хотите, чтобы это изменение было постоянным, вам нужно добавить строку в /etc/sysctl.conf
.
После снижения этого значения до 600 количество подключений неуклонно снижалось в течение нескольких дней.
Я не уверен, как вы проверили настройки count и max в таблице conntrack, но я использовал sysctl netfilter.nf_conntrack_max
и sysctl net.netfilter.nf_conntrack_count
чтобы получить значения.