Назад | Перейти на главную страницу

Зачем менять net.inet.tcp.tcbhashsize во FreeBSD?

Практически в каждом документе по настройке сети FreeBSD я могу найти:

# /boot/loader.conf
net.inet.tcp.tcbhashsize=4096

Обычно это сопровождается каким-нибудь бесполезным утверждением, например «Настройка хеш-таблицы управляющего блока TCP» или «Установите разумное значение». man 4 tcp тоже не очень помогает:

tcbhashsize         Size of the TCP control-block hash table (read-only).
                    This may be tuned using the kernel option TCBHASHSIZE
                    or by setting net.inet.tcp.tcbhashsize in the
                    loader(8).

Единственный документ, который я могу найти, касающийся этой загадочной вещи, - это подраздел «Поиск блока управления протоколом» под транспортным уровнем в Оптимизация стека FreeBSD IP и TCP, но его описание больше касается потенциальных узких мест при его использовании. Кажется, это связано с сопоставлением новых сегментов TCP с их прослушивающими сокетами, но я не уверен, как это сделать.

Для чего именно используется блок управления TCP? Зачем вам устанавливать размер хэша 4096 или любое другое конкретное число?

Это больше похоже на вопрос информатики. Особенно если вы хотите вникнуть в хеш-таблицы и большой-O обозначения.

Ответ:
Если вы обрабатываете много сеансов TCP на сервере, вы действительно хотите искать параметры tcp соединения за время O (1) вместо O (n). FreeBSD использует цепочка для разрешения конфликтов хеш-таблицы. Поэтому, если есть много соединений, будет много конфликтов, и поэтому вместо поиска по хеш-таблице O (1) вам нужно будет выполнить поиск по линейной цепочке со сложностью O (n).

Упомянутый вами параметр - tcbhashsize - это в основном количество сегментов в хеш-таблице.
На наших серверах установлены довольно высокие значения, например 16384 и даже выше. С этой настройкой мы обрабатываем около 60 000 подключений на сервер.

Каждая запись в хэш-таблице в настоящее время на x86_64 использует 252 байта (tcp_inpcb) + 688 байт (tcpcb) памяти ядра для каждой записи (размер kmem составляет 512 ГБ в amd64 с 7.2+ IIRC). Его можно посмотреть через vmstat -z.

О структуре блока TCP Control вы можете прочитать в источниках FreeBSD: tcp_var.h или читать TCP / IP Illustrated, Том 2: Реализация Гэри Р. Райта, У. Ричарда Стивенса