In praktisch jedem FreeBSD-Netzwerkoptimierungsdokument kann ich Folgendes finden:
# /boot/loader.conf
net.inet.tcp.tcbhashsize=4096
Dies wird normalerweise mit einer nicht hilfreichen Anweisung wie "TCP-Steuerblock-Hash-Tabellenoptimierung" oder "Setzen Sie dies auf einen vernünftigen Wert" gepaart. man 4 tcp
ist auch nicht viel Hilfe:
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).
Das einzige Dokument, das dieses mysteriöse Thema berührt, ist der Unterabschnitt "Protokollsteuerungsblock-Suche" unter "Transportschicht" zur Optimierung des FreeBSD-IP- und TCP-Stacks . In seiner Beschreibung geht es jedoch mehr um mögliche Engpässe bei der Verwendung. Es scheint daran gebunden zu sein, neue TCP-Segmente mit ihren Listening-Sockets abzugleichen, aber ich bin mir nicht sicher, wie.
Wofür genau wird der TCP-Steuerblock verwendet? Warum sollten Sie die Hash-Größe auf 4096 oder eine andere bestimmte Zahl festlegen?
quelle
inpcb
.Antworten:
Es ist eher eine Frage der Informatik. Vor allem, wenn Sie sich mit Hash-Tabellen und Big-O- Notationen beschäftigen möchten .
Die Antwort lautet:
Wenn Sie viele TCP-Sitzungen auf einem Server abwickeln, möchten Sie die TCP-Parameter der Verbindung wirklich in O (1) -Zeit anstelle von O (n) nachschlagen. FreeBSD verwendet Verkettung , um Kollisionen von Hash-Tabellen aufzulösen. Wenn also viele Verbindungen bestehen, kommt es zu vielen Kollisionen. Anstelle der Suche nach O (1) -Hashtabellen müssen Sie daher eine lineare Kettensuche mit O (n) -Komplexität durchführen.
Der von Ihnen erwähnte Parameter
tcbhashsize
ist im Grunde die Anzahl der Buckets in der Hash-Tabelle.Auf unseren Servern ist es auf ziemlich hohe Werte wie
16384
und noch höher eingestellt. Mit dieser Einstellung verarbeiten wir ungefähr 60.000 Verbindungen pro Server.Jeder Eintrag in der Hash-Tabelle auf x86_64 verwendet 252 Bytes (
tcp_inpcb
) + 688 Bytes (tcpcb
) Kernelspeicher für jeden Eintrag (kmem-Größe beträgt 512 G in amd64 seit 7.2+ IIRC). Es kann über angesehen werdenvmstat -z
.Über die Struktur des TCP- Steuerblocks können Sie FreeBSD-Quellen lesen: tcp_var.h oder TCP / IP Illustrated, Band 2: Die Implementierung von Gary R. Wright, W. Richard Stevens
quelle