Perché cambiare net.inet.tcp.tcbhashsize in FreeBSD?


8

In praticamente ogni documento di ottimizzazione della rete di FreeBSD posso trovare:

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

Questo di solito è accoppiato con alcune istruzioni inutili come "Ottimizzazione della tabella hash del blocco di controllo TCP" o "Impostalo su un valore ragionevole". man 4 tcpnon è di grande aiuto neanche:

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).

L'unico documento che trovo che tocchi questa cosa misteriosa è la sottosezione Ricerca blocco controllo protocollo sotto Livello di trasporto nell'ottimizzazione dello stack IP e TCP di FreeBSD , ma la sua descrizione riguarda maggiormente i potenziali colli di bottiglia nell'usarlo. Sembra legato alla corrispondenza di nuovi segmenti TCP con i loro socket di ascolto, ma non sono sicuro di come.

A cosa serve esattamente il TCP Control Block? Perché dovresti voler impostare la dimensione dell'hash su 4096 o qualsiasi altro numero particolare?


+1, domanda molto interessante!
Janne Pikkarainen,

AFAIK, tutte le informazioni per la consegna del pacchetto al socket appropriato sono disponibili inpcbsolo tramite .
SaveTheRbtz

Risposte:


3

È più come una domanda di informatica. Soprattutto se vuoi scavare in hash table e notazioni big-O .

La risposta è:
se stai gestendo molte sessioni TCP su server, vuoi davvero cercare i parametri tcp della connessione in O (1) al posto di O (n). FreeBSD usa il concatenamento per risolvere le collisioni della tabella hash. Quindi, se c'è molta connessione, ci saranno molte collisioni e quindi invece di O (1) ricerca nella tabella hash dovrai fare una ricerca a catena lineare con complessità O (n).

Parametro che hai citato - tcbhashsizeè sostanzialmente il numero di bucket nella tabella hash.
Sui nostri server è impostato su valori piuttosto elevati come 16384e anche più elevati. Con questa impostazione gestiamo circa 60.000 connessioni per server.

Ogni voce nella tabella hash da sola attualmente su x86_64 utilizza 252 byte ( tcp_inpcb) + 688 byte ( tcpcb) di memoria del kernel per ogni voce (la dimensione kmem è 512G in amd64 da 7.2+ IIRC). Può essere visualizzato tramite vmstat -z.

Informazioni sulla struttura del blocco di controllo TCP puoi leggere le fonti di FreeBSD: tcp_var.h o leggere TCP / IP illustrato, volume 2: l'implementazione di Gary R. Wright, W. Richard Stevens


Era tutto sfocato ma ora con questa oscura intestazione C tutto è chiaro;)
Gparent

Capisco perché aumentare il numero di bucket in una tabella hash aiuterebbe le prestazioni delle ricerche in quei bucket, non mi rendevo conto che questo era effettivamente ciò che stava facendo questo valore. Se questa è una tabella di bucket, suppongo che il TCPCB sia realmente il punto in cui sono archiviate le informazioni sui socket in modo che i segmenti TCP possano essere abbinati al ricevitore corretto. Puoi confermare questo? Inoltre, parte dello scopo di questi siti è aggregare le informazioni, quindi le risposte "Leggi la fonte" o "Leggi un libro" non sono molto utili.
sh-beta,

Come sei arrivato alla tua messa a punto del 16384? Perché quel? E cosa stai sacrificando per quel valore (presumo memoria del kernel, ma quanto?)? Se fosse una vittoria di prestazione gratuita, mi piace pensare che sarebbe l'impostazione predefinita. Sicuramente costa qualcosa.
sh-beta,

A mio avviso, questo valore dovrebbe essere impostato un po 'vicino al numero di connessioni simultanee che questo server è disposto a gestire. PS. Vuoi davvero diventare un esperto in alcune aree senza leggere fonti / libri? =)
SaveTheRbtz

1
@SaveTheRbtz Adoro l'idea che, se usi una tecnologia, devi smettere di porre domande o diventare così esperto nel codice da poter recitare lo scopo preciso di ogni singola struttura e funzione nello stack di rete. Lo scopo di StackExchange è lo scambio di conoscenze. Sono un esperto in alcune cose e non in altre. Quella linea è determinata dal mio lavoro in cui devo scegliere con cura dove trascorrere il mio tempo. Ma ciò non significa che sono contento di accettare semplicemente il "consiglio" di ottimizzazione che sembra essere stato copiato e incollato senza pensarci da un blog all'altro.
sh-beta,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.