Netzwerk Perfomance: Unterschied zwischen den Versionen
| 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
- 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.