Зачем менять 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 или какому-то другому числу?

1 ответ

Решение

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

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

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

Каждая запись в хеш-таблице сама по себе на 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: Реализация Гари Р. Райт, В. Ричард Стивенс

Другие вопросы по тегам