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?
linux
ubuntu
networking
performance-tuning
latency
Alex V.
quelle
quelle
Antworten:
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:
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.
quelle
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.
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ötigtnet.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=1
beabsichtigt, eine niedrige Latenz gegenüber einem höheren Durchsatz zu bevorzugen; Einstellung = 1 deaktiviert die IPV4-TCP-Prequeue-Verarbeitungnet.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 auftrittnet.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.
quelle