Por que mudar o net.inet.tcp.tcbhashsize no FreeBSD?

8

Em praticamente todos os documentos de ajuste de rede do FreeBSD, posso encontrar:

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

Isso geralmente é emparelhado com algumas instruções inúteis como "ajuste de tabela de hash do bloco de controle TCP" ou "Defina isso com um valor razoável". man 4 tcp 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 que toca nessa coisa misteriosa é a subseção Lookup de bloco de controle de protocolo abaixo de Camada de transporte em Otimizando o IP do FreeBSD e o TCP Stack , mas sua descrição é mais sobre os possíveis gargalos em usá-lo. Parece ligado a novos segmentos TCP correspondentes aos seus soquetes de escuta, mas não sei como.

O que exatamente é o bloco de controle TCP usado para? Por que você deseja definir seu tamanho de hash para 4096 ou qualquer outro número específico?

    
por sh-beta 22.03.2012 / 19:09

1 resposta

3

É mais como uma questão de ciência da computação. Especialmente se você quiser se aprofundar nas tabelas de hash e big-O notações.

A resposta é:
Se você está lidando com muitas sessões TCP no servidor, você realmente quer procurar os parâmetros tcp da conexão em tempo O (1) ao invés 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, assim, em vez da consulta de tabela de hash O (1), você precisará fazer uma pesquisa de cadeia linear com complexidade O (n).

Parâmetro que você mencionou - tcbhashsize é basicamente o número de depósitos na tabela de hash. Em nossos servidores, ele está configurado para valores muito altos, como 16384 e ainda maiores. Com essa configuração, estamos lidando com cerca de 60.000 conexões por servidor.

Cada entrada na tabela hash atualmente em x86_64 usa 252 bytes ( tcp_inpcb ) + 688 bytes ( tcpcb ) da memória do kernel para cada entrada (o tamanho de kmem é 512G em amd64 desde 7.2+ IIRC). Pode ser visto via vmstat -z .

Sobre a estrutura do bloco de controle TCP você pode ler fontes do FreeBSD: tcp_var.h ou leia TCP / IP ilustrado, volume 2: A implementação por Gary R. Wright, W. Richard Stevens

    
por 23.03.2012 / 17:38