TCP-Einstellungen mit geringer Latenz unter Ubuntu

10

In meinem Labor gibt es einen Server für Messungen unter Ubuntu. Und es gibt ein C-Programm, das Daten über eine TCP-Verbindung empfängt und so schnell wie möglich eine Antwort senden sollte.

Aufbau

  • CPUs: 2 Prozessoren x 4 Kerne - Intel (R) Xeon (R) CPU E5345 bei 2,33 GHz
  • RAM: 12 GB
  • Netzwerkkarte: Intel Corporation 80003ES2LAN Gigabit-Ethernet-Controller / 82546EB Gigabit-Ethernet-Controller
  • Netzwerk-Switch: Cisco Catalyst 2960
  • Dateninfo: Datenblöcke kommen ca. alle 10 Millisekunden. Die Datenblockgröße beträgt ca. 1000 Byte.

Die Netzwerklatenz beim Empfang von Paketen ist sehr kritisch (zehn Mikrosekunden sind wichtig). Ich habe das Programm maximal optimiert, aber ich habe keine Erfahrung damit, Ubuntu zu optimieren.

Was kann in Ubuntu konfiguriert werden, um die lokale Verzögerung beim Verarbeiten / Senden von Paketen zu verringern?

Alex V.
quelle
Ja, ich möchte die Marke / das Modell des Servers kennen.
ewwhite
Sie sollten viel tiefer graben. Lesen Sie einige Informationen zur Kerneloptimierung für den Hochfrequenzhandel. Wenn Sie Cisco Paper verkaufen : cisco.com/c/dam/en/us/products/collateral/switches/…. Wenn Sie also auf beiden Seiten eine anständige PCI-E-Karte erwerben, sparen Sie auch etwas. Höchstwahrscheinlich (abhängig davon, wie viel Zeit Sie dafür aufwenden möchten) werden Sie zumindest den Kernel mit unterschiedlichen Einstellungen neu erstellen und viele Dinge entfernen, die Ubuntu benötigt, aber Sie tun es nicht. Wie ewwhite in den Kommentaren geschrieben hat, ist Ubuntu möglicherweise nicht perfekt für die niedrigsten Einstellungen.
Dennis Nolte
Bei der aufgelisteten Hardware handelt es sich um Geräte aus dem Jahr 2008 (Intel 5300-CPUs). Damals waren nicht allzu viele spezielle Hardwareänderungen mit geringer Latenz möglich. Ich habe das System-BIOS so eingestellt, dass es im Hochleistungsmodus ausgeführt wird und die CPU-C-Zustände deaktiviert.
ewwhite
@ewwhite Ja, Sie haben Recht mit Geräten aus der Ära 2008. Ich werde Ihre Vorschläge versuchen. Danke!
Alex V
Gibt es eine Möglichkeit, diese Software für TCP_NODELAY zu optimieren?
Matt

Antworten:

10

Ehrlich gesagt würde ich Ubuntu dafür nicht verwenden ... aber es gibt Optionen, die auf jede Linux-Variante angewendet werden können.

Sie möchten Ihre Netzwerkstapelpuffer erstellen:

net.core.rmem_default = 10000000
net.core.wmem_default = 10000000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

Wenn die Anwendung auf die Festplatte schreibt, ist möglicherweise ein Planer- / Aufzugswechsel erforderlich (z deadline. B. der Aufzug).

Auf Serverebene können Sie den CPU-Regler sowie das Energie- und CPU-Frequenzmanagement (P-Zustände, C-Zustände) ändern.

Auf Betriebssystemebene können Sie die Echtzeitpriorität Ihrer Anwendung ändern ( chrt), optimieren, um Interrupts zu reduzieren, sie an eine CPU oder eine Gruppe von CPUs anheften ( taskset) und unnötige Dienste oder Dämonen stoppen.

Einige Vorschläge finden Sie auch unter: So beheben Sie die Latenz zwischen zwei Linux-Hosts

Es ist schwierig, genauer zu werden, ohne die Hardware oder die Netzwerkausrüstung zu kennen.

ewwhite
quelle
3
Dies ist nicht wirklich der geeignete Ort für religiöse Debatten. Nehmen Sie es woanders hin, z. B. im Chat.
Michael Hampton
1
@MichaelHampton Es gab interessante Links in der Diskussion im Zusammenhang mit der Frage: Red Hat Realtime Tuning Guide .
Alex V
6

Wenn Sie sich auf dem Weg zu hoher Leistung befinden, sollten Sie in der Regel so wenige andere (geplante) Prozesse wie möglich ausführen, da diese Ihre Anwendung beeinträchtigen.

Linux ist wie die klassischen UNIX-Betriebssysteme so konzipiert, dass mehrere Anwendungen auf faire Weise gleichzeitig ausgeführt werden. Es versucht, Ressourcenmangel zu vermeiden, und Sie streben das Gegenteil an. Verhungern Sie alles andere außer Ihrer Anwendung. Einfache Schritte auf Betriebssystemebene sind das Ändern der netten Ebene und der Echtzeitpriorität Ihrer Anwendung, das Ändern des Schedulers oder die Verwendung eines Echtzeitkerns .

TCP / IP wird normalerweise optimiert, um Verbindungsabbrüche zu vermeiden und die verfügbare Bandbreite effizient zu nutzen. Um die geringstmögliche Latenz einer sehr schnellen Verbindung zu erzielen, anstatt die höchstmögliche Bandbreite einer Verbindung zu erzielen, bei der einige Zwischenverbindungen eingeschränkter sind, müssen Sie die Optimierung des Netzwerkstapels anpassen.

 sysctl -a 

zeigt Ihnen eine Vielzahl von Kernel-Einstellungen, die Sie optimieren können. Die Einstellungen hängen davon ab, ob Sie IPv4 oder IPv6 verwenden oder nicht und was genau Sie bereits in Ihrer Anwendung tun, aber von Interesse sein können:

  • net.ipv4.tcp_window_scaling=1 RFC 1323 - Unterstützung für IPV4-TCP-Fenstergrößen größer als 64 KB - wird im Allgemeinen in Netzwerken mit hoher Bandbreite benötigt
  • net.ipv4.tcp_reordering=3 Die maximale Häufigkeit, mit der ein IPV4-Paket in einem TCP-Paketstrom neu angeordnet werden kann, ohne dass TCP einen Paketverlust annimmt und langsam startet.
  • net.ipv4.tcp_low_latency=1beabsichtigt, eine niedrige Latenz gegenüber einem höheren Durchsatz zu bevorzugen; Einstellung = 1 deaktiviert die IPV4-TCP-Prequeue-Verarbeitung
  • net.ipv4.tcp_sack=0 Die Einstellung 1 aktiviert die selektive Bestätigung für IPV4, wodurch tcp_timestamps aktiviert und ein gewisser Paket-Overhead hinzugefügt werden muss, den Sie nicht benötigen, wenn kein Paketverlust auftritt
  • net.ipv4.tcp_timestamps=0 Nur empfohlen, wenn ein Sack benötigt wird.
  • net.ipv4.tcp_fastopen=1 Aktivieren Sie diese Option, um Daten im öffnenden SYN-Paket zu senden.

Die meisten, wenn nicht alle, sind in der Kernelquelle besser dokumentiert .

Sie können natürlich rohe TCP-Sockets codieren und den Kernel-TCP / IP-Stack weitgehend umgehen.

Oft laufen hochgradig abgestimmte Systeme in einem vertrauenswürdigen Netzwerk und haben ihre lokalen (iptables) Firewalls deaktiviert.

HBruijn
quelle