Netzwerk Perfomance
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