Em praticamente todos os documentos de ajuste de rede do FreeBSD, posso encontrar:
# /boot/loader.conf
net.inet.tcp.tcbhashsize=4096
Isso geralmente é associado a alguma declaração inútil, como "Ajuste da tabela de hash do bloco de controle TCP" ou "Configure isso para um valor razoável". man 4 tcp
também não ajuda muito:
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).
O único documento que posso encontrar sobre esse assunto misterioso é a subseção Pesquisa de bloco de controle de protocolo abaixo da Camada de transporte na Otimização da pilha de IP e TCP do FreeBSD , mas sua descrição é mais sobre possíveis gargalos na sua utilização. Parece ligado a combinar novos segmentos TCP com seus soquetes de escuta, mas não sei como.
Para que exatamente o bloco de controle TCP é usado? Por que você deseja definir seu tamanho de hash para 4096 ou qualquer outro número específico?
fonte
inpcb
apenas por via .Respostas:
É mais como uma questão de ciência da computação. Especialmente se você quiser explorar tabelas de hash e notações grandes .
A resposta é:
Se você está lidando com muitas sessões TCP em sever, realmente deseja consultar os parâmetros tcp da conexão no tempo O (1) em vez de O (n). O FreeBSD usa encadeamento para resolver colisões de tabelas de hash. Portanto, se houver muita conexão, haverá muitas colisões e, em vez da pesquisa de tabela de hash O (1), você precisará fazer uma pesquisa de cadeia linear com complexidade O (n).
O parâmetro que você mencionou -
tcbhashsize
é basicamente o número de buckets na tabela de hash.Em nossos servidores, é definido com valores bastante altos
16384
e até mais altos. Com essa configuração, estamos lidando com cerca de 60.000 conexões por servidor.Cada entrada na tabela de hash por si só atualmente em x86_64 usa 252 bytes (
tcp_inpcb
) + 688 bytes (tcpcb
) de memória do kernel para cada entrada (o tamanho do kmem é 512G em amd64 desde 7.2+ IIRC). Pode ser visualizado viavmstat -z
.Sobre a estrutura do bloco TCP Control, você pode ler fontes do FreeBSD: tcp_var.h ou ler TCP / IP Illustrated, Volume 2: A Implementação Por Gary R. Wright, W. Richard Stevens
fonte