параметр ip_conntrack_buckets "на пальцах" (Объясните, пож., что по смыслу означает параметр ядра...)

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модераторы: SLEDopit, Модераторы разделов

Аватара пользователя
Ufomen
Сообщения: 81
ОС: CentOS 5.3

параметр ip_conntrack_buckets "на пальцах"

Сообщение Ufomen »

Объясните, пожалуйста, что по смыслу означает параметр ядра /proc/sys/net/ipv4/netfilter/ip_conntrack_buckets, который учавствует в установлении значения ширины таблицы conntrack?
То, что /proc/sys/net/ipv4/netfilter/ip_conntrack_max означает максимальное количество одновременных сессий, это мне понятно.
Прошу не отсылать меня к английской документации - я ее читал (http://www.wallfire.org/misc/netfilter_conntrack_perf.txt), но смысла этих buckets все равно не понял.
Также неясно
Что это за объединенные листы (linked lists), для чего они используются и какую информацию они содержат?
Заранее благодарю всех, кто поможет объяснить.
Спасибо сказали:
Аватара пользователя
Ufomen
Сообщения: 81
ОС: CentOS 5.3

Re: параметр ip_conntrack_buckets "на пальцах"

Сообщение Ufomen »

Ну значит объясню сам как я понял.
/proc/sys/net/ipv4/netfilter/ip_conntrack_buckets означает сколько места нужно выделить для хранения conntrack таблиц, по дефолту ядро определяет его как отношение ip_conntrack_max / 8

Если узел не занимается больше ничем кроме NAT и firewall, вы можете отдать таблицам conntrack
достаточно много памяти

Размер ядерной памяти, используемые netfilter можно рассчитать по формуле:
size_of_mem_used_by_conntrack (байт) =
CONNTRACK_MAX * sizeof (struct_ip_conntrack) + HASHSIZE * sizeof (struct_list_head)
где:
- sizeof (struct_ip_conntrack) зависит от архитектуры, версии ядра и параметров компиляции. для
того чтобы его определить, необходимо посмотреть в журнал загрузки (при инициализации ip_conntrack)
sizeof (struct_ip_conntrack) составляет около 300 байт на i386 для 2.6.5, для других ядер оно
может колебаться в районе от 352 до 192 байт!
- sizeof (struct_list_head) = 2 * size_of_a_pointer
На i386, size_of_a_pointer составляет 4 байта.

Так, на i386, ядро 2.6.5, size_of_mem_used_by_conntrack составляет около
CONNTRACK_MAX * 300 + HASHSIZE * 8 (байт).

Если мы возьмем HASHSIZE = CONNTRACK_MAX (коль скоро памяти у нас достаточно и нам ее не жалко),
size_of_mem_used_by_conntrack составлять примерно CONNTRACK_MAX * 308 байт на i386 системах, ядро 2.6.5.

Допустим, в роутере установлено 512Мб RAM. Оставим 128Мб для userspace-приложений (хотя это и многовато для
машины в консольном режиме без дополнительных сервисов). Всю остальную память отдадим таблицам conntrack,

Итак, CONNTRACK_MAX = HASHSIZE = (512 - 128) * 1024 ^ 2 / 308 = ~ 1307315

(вместо 32768 для CONNTRACK_MAX, и 4096 для HASHSIZE по умолчанию).

ядра 2.4.21+ и 2.6 лучше воспринимают размеры таблиц равные степени 2, так что можно установить
CONNTRACK_MAX и HASHSIZE равные 1048576 (2^20)


Очень прошу поправить меня если я не прав!
Спасибо сказали: