Pourquoi changer net.inet.tcp.tcbhashsize dans FreeBSD?

8

Dans pratiquement tous les documents d'optimisation de réseau FreeBSD, je peux trouver:

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

Cela est généralement associé à une instruction inutile, comme "Réglage de la table de hachage du bloc de contrôle TCP" ou "Définissez cela sur une valeur raisonnable". man 4 tcpn'est pas très utile non plus:

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

Le seul document que je peux trouver qui touche à cette chose mystérieuse est la sous-section Recherche de bloc de contrôle de protocole sous Transport Layer dans Optimisation de la pile FreeBSD IP et TCP , mais sa description est plus sur les goulots d'étranglement potentiels dans son utilisation. Cela semble lié à la correspondance de nouveaux segments TCP avec leurs sockets d'écoute, mais je ne sais pas comment.

À quoi sert exactement le bloc de contrôle TCP? Pourquoi voudriez-vous définir sa taille de hachage à 4096 ou tout autre nombre particulier?

sh-beta
la source
+1, question très intéressante!
Janne Pikkarainen
AFAIK, toutes les informations pour la livraison du paquet à la prise appropriée sont disponibles via inpcbuniquement.
SaveTheRbtz

Réponses:

3

C'est plus comme une question d'informatique. Surtout si vous voulez creuser dans les tables de hachage et les notations big-O .

La réponse est:
si vous gérez de nombreuses sessions TCP sur un serveur, vous voulez vraiment rechercher les paramètres tcp de la connexion en temps O (1) au lieu de O (n). FreeBSD utilise le chaînage pour résoudre les collisions de tables de hachage. Donc, s'il y a beaucoup de connexions, il y aura beaucoup de collisions et donc au lieu de la recherche de table de hachage O (1), vous devrez faire une recherche de chaîne linéaire avec une complexité O (n).

Le paramètre que vous avez mentionné - tcbhashsizeest essentiellement le nombre de compartiments dans la table de hachage.
Sur nos serveurs, il est réglé sur des valeurs assez élevées comme 16384et même plus élevées. Avec ce paramètre, nous traitons environ 60 000 connexions par serveur.

Chaque entrée dans la table de hachage en elle-même actuellement sur x86_64 utilise 252 octets ( tcp_inpcb) + 688 octets ( tcpcb) de mémoire du noyau pour chaque entrée (la taille kmem est de 512 G en amd64 depuis 7.2+ IIRC). Il peut être consulté via vmstat -z.

À propos de la structure du bloc de contrôle TCP, vous pouvez lire les sources FreeBSD: tcp_var.h ou lire TCP / IP Illustrated, Volume 2: The Implementation Par Gary R. Wright, W. Richard Stevens

SaveTheRbtz
la source
Tout était flou mais maintenant avec cet obscur en-tête C tout est clair;)
gparent
Je comprends pourquoi l'augmentation du nombre de compartiments dans une table de hachage aiderait les performances des recherches dans ces compartiments, je ne savais pas que c'était en fait ce que cette valeur faisait. S'il s'agit d'une table de compartiments, alors je suppose que le TCPCB est vraiment l'endroit où les informations de socket sont stockées afin que les segments TCP puissent être mis en correspondance avec le récepteur approprié. Pouvez-vous le confirmer? De plus, une partie du but de ces sites est de rassembler des informations, donc les réponses "Lire la source" ou "Lire un livre" ne sont pas très utiles.
sh-beta
Comment en êtes-vous arrivé à votre accord de 16384? Pourquoi ça? Et que sacrifiez-vous pour cette valeur (je suppose que la mémoire du noyau, mais combien?)? S'il s'agissait d'une victoire de performance gratuite, j'aime à penser que ce serait la valeur par défaut. Cela coûte sûrement quelque chose.
sh-beta
À mon avis, cette valeur devrait être quelque peu proche du nombre de connexions simultanées que ce serveur est prêt à gérer. PS. Voulez-vous vraiment devenir un expert dans un domaine sans lire de sources / livres? =)
SaveTheRbtz
1
@SaveTheRbtz J'abhorre cette notion selon laquelle, si vous utilisez une technologie, vous devez soit cesser de poser des questions, soit devenir si expert dans le code que vous pouvez réciter le but précis de chaque structure et fonction individuelle dans la pile réseau. Le but de StackExchange est l'échange de connaissances. Je suis un expert dans certaines choses et pas dans d'autres. Cette ligne est déterminée par mon travail où je dois soigneusement choisir où je passe mon temps. Mais cela ne signifie pas que je me contente d'accepter simplement des "conseils" de réglage qui semblent avoir été copiés et collés sans réfléchir d'un blog à l'autre.
sh-beta