TCP/IP Tuning: Kernel Network Stack (Artikel 367)
Maximierung des Netzwerkdurchsatzes durch Kernel-Tuning. Erfahren Sie alles über TCP-Puffergrößen, Backlog-Queues und die Optimierung des Netzwerk-Stacks für High-Traffic-Workloads.
# Network Stack Tuning: Die Autobahn für Datenbits
TL;DR / Management Summary Ein Standard-Kernel ist für das heimische WLAN optimiert, nicht für 100Gbit-Rechenzentren oder Webserver mit Millionen parallelen Verbindungen. Ein Senior Admin nutzt sysctl, um den TCP/IP-Stack zu tunen: Er vergrößert die Send- und Receive-Puffer, optimiert die Backlog-Queues, um Paketverluste bei Lastspitzen zu vermeiden, und aktiviert moderne Algorithmen wie BBR (Bottleneck Bandwidth and RTT). Dieses Modul zeigt, wie Sie den Kernel zur Höchstleistung peitschen.
# 1. Einführung & Architektur
Der Weg durch den Stack.
Jedes Paket durchläuft im Kernel mehrere Warteschlangen (Queues). Wenn diese voll sind, werden Pakete einfach verworfen (Packet Drop), was die Applikation extrem verlangsamt.
# Die Netzwerk-Pipeline (Mermaid)
graph LR
A[Physical Link] --> B[NIC RX Queue]
B --> C[SoftIRQ / NAPI]
C --> D[IP Layer]
D --> E[TCP/UDP Layer]
E --> F[Socket Receive Buffer]
F --> G[Application: read]
subgraph "Tuning Hevers"
H[net.core.netdev_max_backlog] --> C
I[net.core.rmem_max] --> F
J[net.ipv4.tcp_rmem] --> E
end
# 2. Core-Buffer Tuning
Mehr Platz für Pakete.
Wenn der Server bei Traffic-Spitzen “schluckauf” hat, sind oft die Puffer zu klein.
# 1. Globale Speicher-Limits
Datei: /etc/sysctl.d/99-network-tuning.conf
# Max. Empfangspuffer (16MB)
net.core.rmem_max = 16777216
# Max. Sendepuffer (16MB)
net.core.wmem_max = 16777216
# 2. TCP Autotuning
Der Kernel kann den Speicher pro Verbindung dynamisch anpassen.
# min, default, max
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# 3. High-Concurrency: Sockets & Ports
Tausende User gleichzeitig handhaben.
# Ephemeral Ports erweitern
Standardmäßig reserviert Linux nur ca. 28.000 Ports für ausgehende Verbindungen.
net.ipv4.ip_local_port_range = 1024 65535
# TCP Fast Open (TFO)
Beschleunigt den Verbindungsaufbau, indem Daten bereits im SYN-Paket gesendet werden.
net.ipv4.tcp_fastopen = 3
# 4. Day-2 Operations: BBR Congestion Control
Der Google-Algorithmus.
BBR ist ein moderner Algorithmus zur Stauregelung, der massiv höhere Durchsatzraten bei instabilen oder weiten Verbindungen (High BDP) erzielt.
# BBR aktivieren
# Erfordert Kernel 4.9+
echo "net.core.default_qdisc = fq" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control = bbr" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 5. Troubleshooting & “War Stories”
Wenn das Tuning das Netz bricht.
# Story 1: “Der Packet-Drop trotz Idle-CPU”
Symptom: Monitoring meldet Paketverluste, aber die CPU-Last ist bei 5%.
Ursache: net.core.netdev_max_backlog ist zu klein. Die Netzwerkkarte liefert Pakete schneller an, als der Kernel sie in die IP-Ebene schieben kann.
Lösung: Erhöhen Sie den Backlog auf 5000 oder mehr: net.core.netdev_max_backlog = 5000.
# Story 2: “Time-Wait Bucket Full”
Symptom: In den Logs steht TCP: time wait bucket table overflow.
Ursache: Zu viele beendete Verbindungen hängen im TIME_WAIT Status (Artikel 272).
Lösung: Aktivieren Sie net.ipv4.tcp_tw_reuse = 1 und erhöhen Sie net.ipv4.tcp_max_tw_buckets. Deaktivieren Sie jedoch niemals tcp_tw_recycle (falls vorhanden), da dies Probleme mit NAT-Clients verursacht.
# 6. Fazit & Empfehlung
- Vorsicht: Ändern Sie niemals alle Werte gleichzeitig. Testen Sie jeden Parameter einzeln.
- Wartung: Dokumentieren Sie die Standardwerte vor der Änderung (
sysctl -a > defaults.txt). - Wahl: Für Standard-Server reicht der Default. Nutzen Sie Tuning nur für Load-Balancer, Proxy-Server und Datenbanken.
# Anhang: Cheatsheet
| Parameter | Empfehlung | Zweck |
|---|---|---|
net.ipv4.tcp_window_scaling |
1 | Pflicht für > 100Mbit |
net.ipv4.tcp_slow_start_after_idle |
0 | Hält Verbindung schnell |
net.ipv4.tcp_mtu_probing |
1 | Hilft bei MTU-Problemen |
net.core.somaxconn |
4096 | Max. wartende Verbindungen |
net.ipv4.tcp_max_syn_backlog |
8192 | Schutz vor SYN-Floods |
net.ipv4.tcp_fin_timeout |
15 | Schnelleres Aufräumen |
net.ipv4.tcp_keepalive_time |
600 | Kürzere Zombie-Connects |
| Befehl | Wirkung | |
sysctl -p |
Lädt /etc/sysctl.conf |
|
sysctl -w var=val |
Setzt Wert temporär | |
ss -ti |
Zeigt RTT & MSS pro Slot |