Netzwerk Perfomance: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
Zeile 190: Zeile 190:
 
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.
 
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
 
*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.
 +
=Kernel-Puffer
 +
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.
  
 
=Quelle=
 
=Quelle=
 
*https://i0.wp.com/opensourceforu.com/wp-content/uploads/2016/08/Figure-1-Data-receiving-process.jpg
 
*https://i0.wp.com/opensourceforu.com/wp-content/uploads/2016/08/Figure-1-Data-receiving-process.jpg

Version vom 16. November 2019, 16:16 Uhr

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 de 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. =Kernel-Puffer 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.

Quelle