TL;DR

Wir werden diese Schlüsselbereiche optimieren:

  • NIC-Offloading-Techniken
  • TCP_QUICKACK zur Reduzierung der Latenz
  • Optimierung von net.core.rmem_max
  • SO_BUSY_POLL für CPU-Effizienz
  • Strategien zur Minimierung von Latenzspitzen

Der Bedarf an Geschwindigkeit: Warum 100Gbps?

Bevor wir ins Detail gehen, klären wir die entscheidende Frage: Warum 100Gbps? In der Welt des Hochfrequenzhandels zählt jede Mikrosekunde. Es geht nicht nur um Prahlerei; es geht um den Unterschied zwischen Millionen verdienen und alles verlieren.

Aber 100Gbps Durchsatz zu erreichen und zu halten, bedeutet nicht nur, mehr Hardware einzusetzen. Es geht darum, Ihr System fein abzustimmen, um die maximale Leistung aus Ihrer bestehenden Infrastruktur herauszuholen. Und hier kommt die Kernel-Optimierung ins Spiel.

NIC-Offloading: Lassen Sie Ihre Hardware die schwere Arbeit erledigen

Erstens: Wenn Sie NIC-Offloading nicht nutzen, lassen Sie Leistung ungenutzt. Moderne NICs können viele netzwerkbezogene Aufgaben übernehmen, die sonst Ihre CPU belasten würden. So überprüfen Sie Ihre aktuellen Offload-Einstellungen:

ethtool -k eth0

Achten Sie auf diese wichtigen Offloads:

  • tcp-segmentation-offload (TSO)
  • generic-receive-offload (GRO)
  • receive-side-scaling (RSS)

Um diese Offloads zu aktivieren, verwenden Sie:

ethtool -K eth0 tso on gro on

Aber das ist noch nicht alles! Für 100Gbps-Netzwerke sollten Sie diese erweiterten Offloads in Betracht ziehen:

  • ntuple filtering
  • receive packet steering (RPS)
  • receive flow steering (RFS)

Diese können die CPU-Auslastung erheblich reduzieren und die Paketverteilung über die Kerne verbessern.

TCP_QUICKACK: Geduld ist keine Tugend im HFT

Im Hochfrequenzhandel ist das Warten auf ACKs wie das Warten auf trocknende Farbe – niemand hat dafür Zeit. Hier kommt TCP_QUICKACK ins Spiel. Diese praktische Option weist den Kernel an, ACKs sofort zu senden, anstatt sie zu verzögern.

Um TCP_QUICKACK systemweit zu aktivieren:

echo 1 > /proc/sys/net/ipv4/tcp_quick_ack

Für einen bestimmten Socket in Ihrer Anwendung:


int quickack = 1;
setsockopt(socket_fd, IPPROTO_TCP, TCP_QUICKACK, &quickack, sizeof(quickack));

Beachten Sie, dass dies die Latenz erheblich reduzieren kann, aber den Netzwerkverkehr erhöhen könnte. Wie bei allen Optimierungen sollten Sie vorher und nachher messen, um sicherzustellen, dass es Ihrem speziellen Anwendungsfall zugutekommt.

Optimierung von net.core.rmem_max: Die Größe zählt

Bei Empfangspuffern gilt oft: Je größer, desto besser – bis zu einem gewissen Punkt. Der Parameter net.core.rmem_max legt die maximale Empfangspuffergröße in Bytes fest. Für 100Gbps-Netzwerke sollten Sie diesen Wert erhöhen:

sysctl -w net.core.rmem_max=16777216

Dies setzt den maximalen Empfangspuffer auf 16MB. Aber hören Sie hier nicht auf! Sie sollten auch diese verwandten Parameter anpassen:


sysctl -w net.core.wmem_max=16777216
sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"

Denken Sie daran, dass diese Änderungen temporär sind. Um sie dauerhaft zu machen, fügen Sie sie in /etc/sysctl.conf hinzu.

SO_BUSY_POLL: Wenn aktives Warten eine gute Sache ist

In der Welt der Niedriglatenz-Netzwerke ist manchmal die beste Art zu warten, gar nicht zu warten. Hier kommt SO_BUSY_POLL ins Spiel. Diese Socket-Option ermöglicht es dem Kernel, aktiv auf eingehende Pakete zu warten, anstatt auf Interrupts zu setzen.

Um SO_BUSY_POLL in Ihrer Anwendung zu aktivieren:


int busy_poll = 50; // Zeit in Mikrosekunden
setsockopt(socket_fd, SOL_SOCKET, SO_BUSY_POLL, &busy_poll, sizeof(busy_poll));

Sie können das aktive Warten auch systemweit aktivieren:


echo 50 > /proc/sys/net/core/busy_poll
echo 50 > /proc/sys/net/core/busy_read

Seien Sie vorsichtig mit dieser Einstellung, da sie die CPU-Auslastung erhöhen kann. Sie ist am besten auf dedizierten Netzwerk-Kernen zu verwenden.

Die Latenzbestie zähmen: Strategien zur Reduzierung von Spitzen

Selbst mit all diesen Optimierungen können Latenzspitzen immer noch auftreten. Hier sind einige zusätzliche Strategien, um sie in Schach zu halten:

1. IRQ-Affinität

Stellen Sie sicher, dass Netzwerk-Interrupts von dedizierten CPU-Kernen bearbeitet werden:


echo 2-3 > /proc/irq/IHR_ETH_IRQ/smp_affinity_list

2. CPU-Isolierung

Isolieren Sie CPUs für Ihre kritischen Netzwerkaufgaben:


isolcpus=2-3 nohz_full=2-3 rcu_nocbs=2-3

Fügen Sie diese zu Ihren Kernel-Boot-Parametern hinzu.

3. NAPI (New API)

Stellen Sie sicher, dass NAPI auf Ihrer Netzwerkschnittstelle aktiviert ist:


ethtool -k eth0 | grep "napi-tx-"

4. Den Scheduler optimieren

Für latenzempfindliche Aufgaben sollten Sie den SCHED_FIFO-Scheduler in Betracht ziehen:


struct sched_param param;
param.sched_priority = 99;
pthread_setschedparam(pthread_self(), SCHED_FIFO, ¶m);

Alles zusammenfügen: Ein ganzheitlicher Ansatz

Denken Sie daran, dass die Optimierung für 100Gbps-Mikroservices nicht nur darin besteht, einzelne Einstellungen zu ändern. Es geht darum, einen ganzheitlichen Ansatz für Ihr gesamtes System zu verfolgen. Hier sind einige abschließende Tipps, um alles zusammenzuführen:

  • Profilieren Sie Ihre Anwendung, um Engpässe zu identifizieren
  • Verwenden Sie Tools wie perf, Flamegraphs und eBPF für tiefere Einblicke
  • Erwägen Sie DPDK oder Kernel-Bypass-Techniken für extreme Leistung
  • Vergessen Sie nicht Ihr Speicher-I/O – es kann ein versteckter Engpass sein
  • Benchmarken und überwachen Sie Ihr System regelmäßig, um Regressionen frühzeitig zu erkennen

Fazit: Die niemals endende Suche nach Geschwindigkeit

Das Tuning von Linux für 100Gbps-Mikroservices ist nichts für schwache Nerven. Es ist ein komplexer Tanz aus Hardwarefähigkeiten, Kernel-Parametern und Optimierungen auf Anwendungsebene. Aber mit den Techniken, die wir behandelt haben – von NIC-Offloading bis TCP_QUICKACK, von Pufferoptimierung bis zu aktivem Warten – sind Sie nun mit dem Wissen ausgestattet, um Ihre Hochfrequenzhandelsumgebung auf die nächste Stufe zu heben.

Denken Sie daran, dass die Suche nach niedrigerer Latenz und höherem Durchsatz niemals wirklich endet. Experimentieren Sie weiter, messen Sie weiter und vor allem, schieben Sie die Grenzen des Möglichen weiter hinaus. Wer weiß? Vielleicht sprechen wir das nächste Mal über das Tuning für 400Gbps!

"In der Welt des Hochfrequenzhandels ist derjenige verloren, der zögert. Aber derjenige, der seinen Kernel optimiert, beherrscht den Markt." - Anonymer Linux-Kernel-Guru

Gehen Sie nun hinaus und erobern Sie diese Pakete! Und wenn Sie eigene Killer-Tuning-Tipps haben, hinterlassen Sie sie in den Kommentaren. Schließlich sind wir in der gnadenlosen Welt des HFT alle zusammen... bis wir es nicht mehr sind.