Что означает сообщение в kernel.log:
nf_conntrack_alloc: Can't alloc conntrack
nf_conntrack_alloc
разлагается на это:
nf
- NetFilter - Фильтрация IP на основе ядра, обычно доступная через iptables
инструмент пользовательского пространстваconntrack
- отслеживание соединений или анализ потока, администрируемые с помощью conntrack_tools
alloc
- запрос «выделить» место в памяти, в данном случае для отслеживания соединения - обратное dealloc
Cannot alloc conntrack
означает, что попытка выделить память для отслеживания нового сетевого подключения не удалась. Соединения могут означать гораздо больше, чем соединения TCP. ICMP, SIP и UDP могут учитываться в ваших пределах. В Выпуск журнала за июнь 2006 г. определяет отслеживание соединения следующим образом:
По сути, система отслеживания соединений хранит информацию о состоянии соединения в структуре памяти, которая содержит IP-адреса источника и назначения, пары номеров портов, типы протоколов, состояние и тайм-аут. С помощью этой дополнительной информации мы можем определить более интеллектуальные политики фильтрации.
Каждое новое соединение попадает в таблицу отслеживания соединений, которая имеет ограниченное количество записей. Если и когда эта таблица соединений заполняется, самая старая запись удаляется. Это означает, что старые соединения могут внезапно отключиться, если установлено слишком много соединений.
Настраиваемая система называется nf_conntrack_max
по умолчанию это 32767, если я правильно прочитал. Вы можете настроить это на большее число, например 65535 в соответствии с эта страница здесь на serverfault.com. (sysctl -w net.netfilter.nf_conntrack_max=65535
) См. Список значений в /proc/sys/net/netfilter
.
Тем не менее, статья Пола Робертса заявляет, что если таблица действительно заполнялась, вы должны увидеть сообщение nf_conntrack: table full, dropping packet
. Итак, учитывая это, у вас может действительно быть система, в которой слишком много памяти выделено для других вещей, и отслеживание соединений ощущает основную тяжесть нехватки. Рассмотрите возможность завершения работы службы или увеличения ОЗУ. Если вы находитесь в сценарии с ограниченным объемом памяти, вам может потребоваться разделение символов и другие приемы, чтобы получить больше памяти.
kmem_cache_alloc в net / netfilter / nf_conntrack_core.c nf_conntrack_alloc () возвращает NULL. Ядру не удалось выделить память.
Проверить свободную память (cat / proc / meminfo и slabtop).