Linux Netzwerk Performance

Aus xinux.net
(Weitergeleitet von Netzwerk Performance)
Zur Navigation springen Zur Suche springen
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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

Netzwerk-perfomance-1.jpg

  • 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

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

Quelle