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 tcp
n'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?
la source
inpcb
uniquement.Réponses:
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é -
tcbhashsize
est essentiellement le nombre de compartiments dans la table de hachage.Sur nos serveurs, il est réglé sur des valeurs assez élevées comme
16384
et 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é viavmstat -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
la source