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

8

Практически в каждом документе по настройке сети 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, очень интересный вопрос!
Янне Пиккарайнен
AFAIK, вся информация для доставки пакета в соответствующий сокет доступна inpcbтолько через .
SaveTheRbtz

Ответы:

3

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

Ответ таков:
если вы обрабатываете много сеансов TCP на сервере sever, вы действительно хотите искать 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: Реализация Гари Р. Райт, В. Ричард Стивенс

SaveTheRbtz
источник
Все было размыто, но теперь с этим непонятным заголовком C все ясно;)
gparent
Я понимаю, почему увеличение количества сегментов в хеш-таблице может повысить производительность поиска в этих сегментах. Я не осознавал, что именно это и было этим значением. Если это таблица сегментов, то я полагаю, что именно в TCPCB хранится информация о сокетах, поэтому сегменты TCP могут быть сопоставлены с соответствующим получателем. Вы можете это подтвердить? Кроме того, частью этих сайтов является сбор информации, поэтому ответы «Читать источник» или «Читать книгу» не очень полезны.
Sh-бета
Как вы пришли к своему тюнингу 16384? Почему так? И чем вы жертвуете за это значение (я полагаю, память ядра, но сколько?)? Если бы это был бесплатный выигрыш в производительности, мне бы хотелось думать, что это будет по умолчанию. Конечно, это стоит чего-то.
sh-beta
На мой взгляд, это значение должно быть несколько близко к числу одновременных соединений, которые этот сервер готов обработать. PS. Вы действительно хотите стать экспертом в какой-то области, не читая источники / книги? =)
SaveTheRbtz
1
@SaveTheRbtz Я ненавижу это понятие, что, если вы используете технологию, вам нужно либо перестать задавать вопросы, либо стать настолько опытным в коде, что вы можете перечислить точное назначение каждой отдельной структуры и функции в сетевом стеке. Цель StackExchange - обмен знаниями. Я эксперт в некоторых вещах, а не в других. Эта линия определяется моей работой, где я должен тщательно выбирать, где я провожу свое время. Но это не значит, что я просто согласен с настройкой «совета», который, похоже, был бездумно скопирован и вставлен из блога в блог.
SH-бета