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