Tuning TCP Linux

Das Tutorial basiert auf dem TCP Tuning Linux Guide & TCP Tuning for WAN und ist im wesentlichen eine Übersetzung mit ein paar zusätzlichen Erläuterungen

LINUX

Da es  unterschiedliche TCP Optionen in denKernelversionen 2.4. und 2.6. gibt, soll es uns im folgenden ausschliesslich um Kernelversionen der 2.6 – Familie gehen. Prinzipiell finden sich alle Parameter in der Datei ip-sysctl.txt die den Kernelsourcen beiligt. Um die TCP Einstellungen zu ändern, werden die Einträge entweder in die /etc/sysctl.conf eingefügt oder entsprechend abgeändert und mit “sysctl -p” übernommen.

Als erstes erhöhen wir  den zu klein geratenen TCP buffer:

net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_moderate_rcvbuf = 1
sysctl net.ipv4.tcp_sack =  0

# für Gigabitadapter
net.core.netdev_max_backlog = 2500
#für 10 Gigabit
net.core.netdev_max_backlog = 30000

Darüber hinaus überprüfen wir ob folgende Werte auf 1 gesetzt sind:

sysctl net.ipv4.tcp_window_scaling
sysctl net.ipv4.tcp_timestamps

Mit der Kernelversion 2.6.13 unterstützt Linux sogenannte „pluggable congestion control algorithmen“ . Welche Algorithmus Verwendung finden soll, wird mittels net.ipv4.tcp_congestion_control festgelegt. Abhängig von der Kernelversion sollte er default auf cubic oder reno stehen. Um nachzuschauen welche Algorithmen der Kernel unterstützt:

sysctl net.ipv4.tcp_available_congestion_control

Von Hause aus stehen mehrere Algorithmen zur Verfügung, die Unterstützung muss beim kompilieren des Kernel berücksichtigt werden. Weiterführende Informationen und Arbeitsweise der einzelnen Algorithmen findet sich hier. Ein Benchmark über die unterschiedlichen Algorithmen mit diversen MTU Werten findet sich hier für eine Teststellung im 10GBit Bereich. Der Algorithmus wird dann beispielsweise durch

sysctl -w net.ipv4.tcp_congestion_control=htcp

gesetzt.

Um den Durchsatz zu erhöhen können wir ebenso die die Queue des Interfaces anpassen:

ifconfig eth0 txqueuelen 10000

Letzteres ist einzig für Gigabit Ethernet Adapter zu empfehlen, darüber hinaus ist an dieser Stelle mit Nebenwirkungen zu rechnen: wie z.B. dass die einzelnen Streams nicht mehr gleichwertig das Medieum teilen.

Jumbo Frames und die Spielerei mit den MTU-Werten:

Laut IEEE 802.3 haben Frames im Ethernet eine maximale Größe von 1518 Byte. Das ergibt beim Einsatz von IP eine MTU Größe von 1500 Byte. Als Jumbo Frames werden nun  Frames mit einer Größe über 1518 Byte bezeichnet. Jumbo Frames sind ersteinmal nicht standardisiert. Jeder Netzwerkhersteller implementiert hier seinen eigenen „Standard“. Typischweise werden Framegrößen von 9 kB, 12kB, 14 kB und 16 kB verwendet. Der Einsatz von Jumbo Frames soll die Interruptlast der beteiligten Stationen verringern. Ein weiterer positiver Effekt, der großen Frames, ist der kleinere Protokolloverhead.

Damit die Übertragung von Jumbo Frames funktioniert, müssen alle Switche und Router zwischen Sender und Empfänger diese unterstützen. Und hier fangen die Probleme an. Da kein Standard existiert, ist die Unterstützung der Hersteller recht unterschiedlich. Auch zwischen den einzelnen Produkten eines Herstellers gibt es oft Unterschiede bei der Behandlung von „Jumbos“. Cisco unterstützt Jumbo Frames nur bei bestimmten Modulen und teilweise nur auf bestimmten Ports von Modulen. Hier ist also Lesen angesagt. Sinnvoll ist der Einsatz von Jumbo Frames unter Umständen in einem Cluster Server, da hier die Member des Clusters über eine kontrollierte Infrastruktur kommunizieren. Switche, Router und Netzwerkkarten die keine großen Frames kennen, verwerfen die Jumbos einfach. In den Fehlercountern tauchen diese dann als Giants auf.