Linux Netzwerk Performance
Intention
- Router, Switche, Kabel wurden verbessert
- Microprozessoren hinken hinten dran
- Letztendlich muss das Betriebssystem die Daten verarbeiten
- Darum ist ein präzises Anpassen des Betriebssystem wichtig
Wie verarbeitet das Betriebssystem die Daten
- Daten werden von der Netzwerkkarte aufgenommen
- Danach werden sie im Ring Buffer für den Empfang (RX) gespeichert
- Es gibt auch einen Ring Buffer für das Senden (TX)
- Wenn der Kernel auf das Paket zugreifen kann löst der Treiber einen Software IRQ aus
- Dieser veranlasst einen Datenzugriff (DMA)
- Der Kernel bekommt die Daten in Datenstruktur sk_buff um das Paket bis zur MTU zu halten.
- Wenn die Kernel Buffer gefüllt sind gehen die Daten an die IP/TCP oder UDP Schicht.
- Früher löste ein Hard Interupt das Senden aus.
- Dies wurde durch den Soft Interrupt ersetzt.
- Dieser wird verwaltet von der New API.
Tools zum Monitoring und Diagnose des Systems
- ip
- netstat
- ss
- ethtool
Benchmarkprogramme vor dem Tunen
- netperf
- iperf
- iperf3
Grundlegendes vor Tunning
- Jedes System ist unterschiedlich (CPU,MEM,NIC,OS)
- Es gibt keine Universallösung
- Man braucht gute Kenntnisse des Systems
- Man muss den Flaschenhals finden
Pakete werden verworfen
Das Problem kann an folgenden Punkten liegen:
- NIC
- SOFT IRQ
- Kernel Buffer
- Netwerkschicht (IP,TCP,UDP)
Erster Perfomance Test mit Iperf3
Server
- iperf3 -s -p 1234
----------------------------------------------------------- Server listening on 1234 ----------------------------------------------------------- Accepted connection from 10.81.4.8, port 43630 [ 5] local 10.81.1.79 port 1234 connected to 10.81.4.8 port 43632 [ ID] Interval Transfer Bandwidth [ 5] 0.00-1.00 sec 2.35 GBytes 20.2 Gbits/sec [ 5] 1.00-2.00 sec 2.86 GBytes 24.6 Gbits/sec [ 5] 2.00-3.00 sec 2.83 GBytes 24.3 Gbits/sec [ 5] 3.00-4.00 sec 2.80 GBytes 24.0 Gbits/sec [ 5] 4.00-5.00 sec 2.86 GBytes 24.6 Gbits/sec [ 5] 5.00-6.00 sec 2.79 GBytes 24.0 Gbits/sec [ 5] 6.00-7.00 sec 2.88 GBytes 24.8 Gbits/sec [ 5] 7.00-8.00 sec 2.87 GBytes 24.6 Gbits/sec [ 5] 8.00-9.00 sec 2.72 GBytes 23.4 Gbits/sec [ 5] 9.00-10.00 sec 2.84 GBytes 24.4 Gbits/sec [ 5] 10.00-10.04 sec 106 MBytes 22.7 Gbits/sec - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bandwidth [ 5] 0.00-10.04 sec 0.00 Bytes 0.00 bits/sec sender [ 5] 0.00-10.04 sec 27.9 GBytes 23.9 Gbits/sec receiver ----------------------------------------------------------- Server listening on 1234 -----------------------------------------------------------
Client
- iperf3 -c 10.81.1.79 -p 1234
Connecting to host 10.81.1.79, port 1234 [ 4] local 10.81.4.8 port 43632 connected to 10.81.1.79 port 1234 [ ID] Interval Transfer Bandwidth Retr Cwnd [ 4] 0.00-1.00 sec 2.47 GBytes 21.2 Gbits/sec 0 3.11 MBytes [ 4] 1.00-2.00 sec 2.87 GBytes 24.6 Gbits/sec 0 3.11 MBytes [ 4] 2.00-3.00 sec 2.82 GBytes 24.2 Gbits/sec 0 3.11 MBytes [ 4] 3.00-4.00 sec 2.80 GBytes 24.0 Gbits/sec 0 3.11 MBytes [ 4] 4.00-5.00 sec 2.87 GBytes 24.7 Gbits/sec 0 3.11 MBytes [ 4] 5.00-6.00 sec 2.78 GBytes 23.9 Gbits/sec 0 3.11 MBytes [ 4] 6.00-7.00 sec 2.90 GBytes 24.9 Gbits/sec 0 3.11 MBytes [ 4] 7.00-8.00 sec 2.85 GBytes 24.5 Gbits/sec 0 3.11 MBytes [ 4] 8.00-9.00 sec 2.72 GBytes 23.4 Gbits/sec 0 3.11 MBytes [ 4] 9.00-10.00 sec 2.84 GBytes 24.4 Gbits/sec 0 3.11 MBytes - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bandwidth Retr [ 4] 0.00-10.00 sec 27.9 GBytes 24.0 Gbits/sec 0 sender [ 4] 0.00-10.00 sec 27.9 GBytes 24.0 Gbits/sec receiver iperf Done.
Statistiken anzeigen mit Ethtool
- ethtool -S eth0
NIC statistics: rx_packets: 84 tx_packets: 86 rx_bytes: 25416 tx_bytes: 16356 rx_broadcast: 1 tx_broadcast: 2 rx_multicast: 0 tx_multicast: 8 rx_errors: 0 tx_errors: 0 tx_dropped: 0 multicast: 0 collisions: 0 rx_length_errors: 0 rx_over_errors: 0 rx_crc_errors: 0 rx_frame_errors: 0 rx_no_buffer_count: 0 rx_missed_errors: 0 tx_aborted_errors: 0 tx_carrier_errors: 0 tx_fifo_errors: 0 tx_heartbeat_errors: 0 tx_window_errors: 0 tx_abort_late_coll: 0 tx_deferred_ok: 0 tx_single_coll_ok: 0 tx_multi_coll_ok: 0 tx_timeout_count: 0 tx_restart_queue: 0 rx_long_length_errors: 0 rx_short_length_errors: 0 rx_align_errors: 0 tx_tcp_seg_good: 1 tx_tcp_seg_failed: 0 rx_flow_control_xon: 0 rx_flow_control_xoff: 0 tx_flow_control_xon: 0 tx_flow_control_xoff: 0 rx_long_byte_count: 25416 rx_csum_offload_good: 0 rx_csum_offload_errors: 0 alloc_rx_buff_failed: 0 tx_smbus: 0 rx_smbus: 0 dropped_smbus: 0
Tuning der Netzwerkadapters (NIC)
- Normalerweise ist die MTU auf 1500 begrennzt
- Bei 10GB Netzen sollte man den Wert auf 9000 erhöhen
- Diese nennt man Jumbo Frames
Verändern der MTU
- ip link set mtu 9000 ens18
Interrupt Coalescence (IC)
Nachdem der Netzwerkadapter die Pakete empfangen hat, gibt der Gerätetreiber einen einzelnen harten Interrupt aus, gefolgt von weichen Interrupts (die von NAPI verarbeitet werden). Interrupt-Koaleszenz ist die Anzahl der Pakete, die der Netzwerkadapter empfängt, bevor ein fester Interrupt ausgegeben wird. Das Ändern des Werts, um Interrupts schnell auszulösen, kann zu einem hohen Overhead führen und somit die Leistung verringern. Ein hoher Wert kann jedoch zu Paketverlust führen. Standardmäßig befinden sich Ihre Einstellungen im adaptiven IC-Modus, der den Wert automatisch entsprechend dem Netzwerkverkehr ausgleicht. Da die neuen Kernel jedoch NAPI verwenden, wodurch schnelle Interrupts (in Bezug auf die Leistung) wesentlich kostengünstiger sind, können Sie diese Funktion deaktivieren.
Anzeigen der Coalesce Parameter
- ethtool -c ens18
Coalesce parameters for ens18: Adaptive RX: on TX: on stats-block-usecs: 0 sample-interval: 0 pkt-rate-low: 0 pkt-rate-high: 0 rx-usecs: 0 rx-frames: 0 rx-usecs-irq: 0 rx-frames-irq: 0 tx-usecs: 0 tx-frames: 0 tx-usecs-irq: 0 tx-frames-irq: 0 rx-usecs-low: 0 rx-frame-low: 0 tx-usecs-low: 0 tx-frame-low: 0 rx-usecs-high: 0 rx-frame-high: 0 tx-usecs-high: 0 tx-frame-high: 0
- ethtool -C eth0 adaptive-rx off
Pause Frames
Ein Pausenrahmen ist die Dauer der Pause in Millisekunden, die der Adapter an den Netzwerk-Switch ausgibt, um das Senden von Paketen zu stoppen, wenn der Ringpuffer voll ist. Wenn der Pausenrahmen aktiviert ist, ist der Verlust von Paketen minimal.
Pause Frame aktivieren
- ethtool -a eth0
- ethtool -A eth0 rx on tx on
Software Interrupt
Wenn der Software-Interrupt Pakete für längere Zeit nicht verarbeitet, kann dies zu einem Überlauf des NIC-Puffers und damit zu Paketverlusten führen. netdev_budget zeigt den Standardwert des Zeitraums an, für den softirq ausgeführt werden soll.
- sysctl net.core.netdev_budget
Der Standardwert sollte 300 sein und muss möglicherweise auf 600 erhöht werden, wenn Sie über eine hohe Netzwerklast oder ein 10-Gbit / s-System (und höher) verfügen.
- sysctl -w net.core.netdev_budget = 600
IRQ-Balance
Interrupt-Anforderungen werden von verschiedenen CPUs in Ihrem System im Round-Robin-Verfahren verarbeitet. Aufgrund der regelmäßigen Kontextumschaltung für Interrupts kann sich das Zeitlimit für die Anforderungsbearbeitung erhöhen. Das Dienstprogramm irqbalance wird zum Ausgleichen dieser Interrupts in der CPU verwendet und muss für eine bessere Leistung deaktiviert werden.
- service irqbalance stop
Wenn Ihr System keinen hohen Datenempfang und keine hohe Datenübertragung unterstützt (wie im Fall eines Heimanwenders), ist diese Konfiguration hilfreich, um die Leistung zu steigern. Für den industriellen Einsatz muss es jedoch optimiert werden, um eine bessere Leistung zu erzielen, da das Stoppen eine hohe Belastung für eine einzelne CPU verursachen kann - insbesondere für Dienste, die schnelle Interrupts wie ssh verursachen. Sie können Irqbalance auch für bestimmte CPUs deaktivieren. Ich empfehle, dass Sie das tun, indem Sie / etc / sysconfig / irqbalance bearbeiten. Informationen zum Ausgleich bestimmter CPUs finden Sie unter http://honglus.blogspot.in/2011/03/tune-interrupt-and-process-cpu-affinity.html.
Die Socket-Puffergröße beträgt
- sysctl net.core.wmem_default
- sysctl net.core.rmem_default
- sysctl net.core.rmem_max
- sysctl core.wmem_max
Diese Parameter zeigen die Standard- und die maximale Schreib- (empfangende) und Lese- (sendende) Puffergröße an, die jedem Verbindungstyp zugewiesen sind. Der voreingestellte Wert ist immer etwas niedrig, da der zugewiesene Speicherplatz aus dem RAM entnommen wird. Wenn Sie dies erhöhen, kann sich die Leistung für Systeme verbessern, auf denen Server wie NFS ausgeführt werden. Wenn Sie sie auf 256 KB / 4 MB erhöhen, funktioniert dies am besten. Andernfalls müssen Sie diese Werte vergleichen, um den idealen Wert für die Konfiguration Ihres Systems zu finden.
- sysctl -w net.core.wmem_default = 262144.
- sysctl -w net.core.wmem_max = 4194304
- sysctl -w net.core.rmem_default = 262144
- sysctl -w net.core.rmem_max = 4194304
Jedes System hat andere Werte und das Erhöhen des Standardwerts kann die Leistung verbessern, aber Sie müssen für jede Wertänderung ein Benchmarking durchführen.
Maximale Warteschlangengröße
Bevor die Daten von der TCP / UDP-Schicht verarbeitet werden, stellt Ihr System die Daten in die Kernel-Warteschlange. Der Wert net.core.netdev_max_backlog gibt die maximale Anzahl von Paketen an, die vor der Übermittlung an die obere Ebene in die Warteschlange gestellt werden sollen. Der Standardwert reicht für eine hohe Netzwerklast nicht aus. Durch einfaches Erhöhen dieses Werts wird der Leistungsabfall aufgrund des Kernels behoben. Verwenden Sie sysctl mit $ sysctl net.core.netdev_max_backlog, um den Standardwert anzuzeigen. Der Standardwert ist 1000 und eine Erhöhung auf 3000 reicht aus, um zu verhindern, dass Pakete in einem 10-Gbit / s-Netzwerk (oder mehr) abgelegt werden.
TCP / UDP-Verarbeitung
- sysctl net.ipv4.tcp_rmem
- sysctl net.ipv4.tcp_wmem
Diese Werte sind ein Array mit drei Ganzzahlen, die die minimale, durchschnittliche und maximale Größe der TCP-Lese- und -Sendepuffer angeben.
Hinweis: Die Werte sind in Seiten angegeben. Verwenden Sie den Befehl
- getconf PAGE_SIZE
um die Seitengröße anzuzeigen
Für den neuesten Kernel (nach 2.6) gibt es eine Funktion zur automatischen Optimierung, die die TCP-Puffergröße dynamisch anpasst, bis der Maximalwert erreicht ist. Diese Funktion ist standardmäßig aktiviert und ich empfehle, sie eingeschaltet zu lassen. Sie können dies überprüfen, indem Sie den folgenden Befehl ausführen:
- cat /proc/sys/net/ipv4/tcp_moderate_rcvbuf
Verwenden Sie dann den folgenden Befehl, um es zu aktivieren, falls es deaktiviert ist:
- sysctl -w net.ipv4.tcp_moderate_rcvbuf = 1
Diese Einstellung reserviert Speicherplatz bis zum Maximalwert, falls Sie die maximale Puffergröße erhöhen müssen, wenn Sie feststellen, dass der Kernel-Puffer Ihr Engpass ist. Der Durchschnittswert muss nicht geändert werden, aber der Maximalwert muss höher als das BDP (Bandbreitenverzögerungsprodukt) eingestellt werden, um den maximalen Durchsatz zu erzielen.
BDP = Bandbreite (B / s) * RTT (Sekunden), wobei die RTT (Umlaufzeit) berechnet werden kann, indem ein Ping an ein anderes System gesendet und die durchschnittliche Zeit in Sekunden ermittelt wird. Sie können den Wert mit sysctl mit dem folgenden Befehl ändern:
- sysctl -w net.ipv4.tcp_rmem = ”65535 131072 4194304”
- sysctl -w net.ipv4.tcp_wmem = ”65535 131072 194304”
Maximale Anzahl anstehender Verbindungen
Eine Anwendung kann die maximale Anzahl anstehender Anforderungen angeben, die in die Warteschlange gestellt werden sollen, bevor eine Verbindung verarbeitet wird. Wenn dieser Wert das Maximum erreicht, fallen weitere Verbindungen ab. Für Anwendungen wie einen Webserver, die viele Verbindungen herstellen, muss dieser Wert hoch sein, damit diese ordnungsgemäß funktionieren. Führen Sie den folgenden Befehl aus, um das maximale Verbindungs-Backlog anzuzeigen:
- sysctl net.core.somaxconn
Der Standardwert ist 128 und kann zu einem sehr sicheren Wert werden.
- sysctl -w net.core.somaxconn = 2048
TCP-Zeitstempel
TCP-Zeitstempel ist eine TCP-Funktion, die in jedes Paket einen Zeitstempel-Header einfügt, um die genaue Umlaufzeit zu berechnen. Diese Funktion verursacht einen geringen Overhead und kann deaktiviert werden, wenn die CPU-Leistung zur Verarbeitung von Paketen nicht erhöht werden muss.
- sysctl -w net.ipv4.tcp_timestamps = 0
TCP SACK
TCP Selective Acknowledgments (SACK) ist eine Funktion, mit der TCP ACK für jeden Segmentstrom von Paketen senden kann, im Vergleich zu herkömmlichem TCP, das ACK nur für zusammenhängende Segmente sendet. Diese Funktion kann einen geringen CPU-Overhead verursachen. Daher kann das Deaktivieren den Netzwerkdurchsatz erhöhen.
- sysctl -w net.ipv4.tcp_sack = 0
TCP FIN-Zeitüberschreitung
Bei einer TCP-Verbindung müssen beide Seiten die Verbindung unabhängig voneinander trennen. Linux TCP sendet ein FIN-Paket, um die Verbindung zu schließen, und wartet bis zur festgelegten Zeit, die in ... angegeben ist, auf FINACK.
- sysctl net.ipv4.tcp_fin_timeout
Der Standardwert (60) ist ziemlich hoch und kann auf 20 oder 30 verringert werden, damit der TCP die Verbindung schließt und Ressourcen für eine andere Verbindung freigibt.
- sysctl -w net.ipv4.tcp_fin_timeout = 20
UDP-Puffergröße
UDP benötigt im Allgemeinen keine Optimierungen, um die Leistung zu verbessern. Sie können jedoch die UDP-Puffergröße erhöhen, wenn UDP-Paketverluste auftreten.
- sysctl net.core.rmem_max
Verschiedene Verbesserungen IP-Ports: net.ipv4.ip_local_port_range zeigt alle für eine neue Verbindung verfügbaren Ports an. Ist kein Port frei, wird die Verbindung abgebrochen. Das Erhöhen dieses Werts hilft, dieses Problem zu vermeiden.
Verwenden Sie den folgenden Befehl, um den Portbereich zu überprüfen:
- sysctl net.ipv4.ip_local_port_range
Sie können den Wert mit dem folgenden Befehl erhöhen:
- sysctl -w net.ipv4.ip_local_port_range = "20000 60000"
tuned
Tuned ist ein sehr nützliches Tool, um Ihr System anhand verschiedener Profile automatisch zu konfigurieren. Abgesehen von der manuellen Optimierung werden bei der Optimierung alle erforderlichen Optimierungen dynamisch für Sie vorgenommen. Sie können es mit dem folgenden Befehl herunterladen:
- apt-get install tuned
Verwenden Sie den folgenden Befehl, um den Daemon zu starten:
- tuned -d
Um die verfügbaren Profile zu überprüfen, können Sie manuell eingestellte Profile anzeigen. Sie können Ihr eigenes Profil erstellen, aber für die beste Netzwerkleistung bietet tuned bereits einige interessante Profiloptionen wie Netzwerkdurchsatz und Netzwerklatenz. Verwenden Sie den folgenden Befehl, um ein optimiertes Profil festzulegen:
- tuned -p network-throughput
Linux TCP BBR congestion control
TCP BBR, Bottleneck Bandwidth and RTT, verspricht den Durchsatz und die Latenz von TCP Verbindungen deutlich zu verbessern. Entwickelt wurde es von Google und wird schon auf google.com und YouTube eingesetzt. Vereinfacht gesagt wartet BBR bei Packet Loss deutlich länger darauf seine Geschwindigkeit zu reduzieren als andere congestion control Algorithmen, wie Reno oder CUBIC, und kann damit schnelle Internetleitungen besser ausnutzen. TCP BBR Erfordert mindestens Kernel 4.9.
Konfiguration
- sysctl net.ipv4.tcp_available_congestion_control
net.ipv4.tcp_available_congestion_control = reno cubic
- sysctl net.ipv4.tcp_congestion_control
net.ipv4.tcp_congestion_control = cubic
- vi /etc/sysctl.d/10-kernel-bbr.conf
net.core.default_qdisc=fq net.ipv4.tcp_congestion_control=bbr
- sysctl --load=/etc/sysctl.d/10-kernel-bbr.conf
- sysctl net.ipv4.tcp_available_congestion_control
net.ipv4.tcp_available_congestion_control = reno cubic bbr
- sysctl net.ipv4.tcp_congestion_control
net.ipv4.tcp_congestion_control = bbr
Bufferbloat
- https://www.linux-magazin.de/ausgaben/2016/04/best-practices/
- https://netzpalaver.de/2017/01/31/bufferbloat-die-verborgene-ursache-von-langsamen-internet-verbindungen/
Abhilfe
- sysctl net.core.default_qdisc
net.core.default_qdisc = fq
- echo net.core.default_qdisc = fq_codel >> /etc/sysctl.conf
- sysctl -p
net.core.default_qdisc = fq_codel