network linux troubleshooting - ghdrako/doc_snipets GitHub Wiki


tags:

  • linux
  • networking
  • performance
  • sysadmin
  • troubleshooting

Diagnostyka odbioru ruchu sieciowego w Linux

1. Przepływ pakietu

Uproszczony przepływ odebranego pakietu:

SIEĆ
  ↓
NIC
  ↓
RX ring / buffer karty
  ↓
NAPI
  ↓
CPU / softirq
  ↓
softnet / backlog
  ↓
kernel network stack
  ↓
UDP socket
  ↓
aplikacja

Problem z odbiorem może wystąpić na każdym z tych etapów.


2. NIC queue / RX ring

Sprawdzenie

ethtool -g ens2f1

Pokazuje rozmiary sprzętowych kolejek karty sieciowej.

Przykład:

Ring parameters for ens2f1:
Pre-set maximums:
RX: 4096
TX: 4096

Current hardware settings:
RX: 1024
TX: 1024

Najważniejsze jest:

  • RX – Receive, czyli kolejka odbieranych pakietów,
  • TX – Transmit, czyli kolejka wysyłanych pakietów.

Można to traktować jako miejsce, w którym karta odkłada odebrane pakiety, zanim CPU je przetworzy.

Jeżeli ruch jest bardzo duży i CPU nie nadąża, RX ring może się zapełnić i mogą wystąpić dropy.


3. Dropy na karcie sieciowej

Sprawdzenie

ethtool -S ens1f1 | grep -Ei 'drop|miss|error|discard'

ethtool -S pokazuje szczegółowe statystyki sterownika/NIC.

Interesujące są przede wszystkim liczniki związane z:

rx_*drop*
rx_*miss*
rx_*error*

Nazwy liczników zależą od konkretnej karty i sterownika.

Do obserwacji w czasie można użyć:

watch -n 1 'ethtool -S ens1f1 | grep -Ei "drop|miss|error|discard"'

Interpretacja

Drop na tym poziomie oznacza, że pakiet został utracony zanim został normalnie przekazany dalej do stosu sieciowego.


4. /proc/net/softnet_stat

cat /proc/net/softnet_stat

Pokazuje statystyki przetwarzania ruchu sieciowego przez kernel.

Każdy wiersz odpowiada jednemu CPU:

CPU0 → pierwszy wiersz
CPU1 → drugi wiersz
CPU2 → trzeci wiersz
CPU3 → czwarty wiersz
...

Dane są zapisane w postaci szesnastkowej.

Uwaga: znaczenie poszczególnych kolumn zależy od wersji kernela. Nie należy bezwarunkowo interpretować kolumn wyłącznie na podstawie ich numeru bez sprawdzenia wersji kernela/dokumentacji.


5. NAPI i netdev_budget

Sprawdzenie:

cat /proc/sys/net/core/netdev_budget

netdev_budget określa budżet pracy NAPI podczas jednego przebiegu przetwarzania ruchu sieciowego.

Uproszczony przykład:

netdev_budget = 300

Do obsłużenia jest 1000 pakietów:

300 → pierwszy przebieg
300 → drugi
300 → trzeci
100 → kolejny

Mechanizm ten chroni CPU przed sytuacją, w której obsługa sieci zablokowałaby CPU na zbyt długo.


6. dev_weight

Sprawdzenie:

cat /proc/sys/net/core/dev_weight

dev_weight określa domyślną wagę/limit liczby pakietów obsługiwanych przez NAPI w jednym przebiegu dla danego CPU.

Uproszczony model:

netdev_budget
    ↓
budżet pracy dla przebiegu softirq/NAPI

dev_weight
    ↓
domyślna waga NAPI na CPU

Nie należy traktować tego dosłownie jako:

netdev_budget = wszystkie NIC
dev_weight   = jeden NIC

Jest to bardziej złożone i zależy od wersji kernela oraz implementacji NAPI.


7. Backlog

Sprawdzenie:

cat /proc/net/softnet_stat

oraz:

cat /proc/sys/net/core/netdev_max_backlog

Backlog jest kolejką pakietów oczekujących na dalsze przetwarzanie przez kernel.

Schemat:

NIC → NAPI → backlog → kernel network stack → socket → aplikacja

Jeżeli pakiety napływają szybciej, niż CPU może je przetwarzać:

napływ pakietów
████████████████████████

CPU przetwarza
██████

backlog
██████████████████

Backlog zaczyna rosnąć.

Jeżeli kolejka zostanie przepełniona, pakiety mogą zostać odrzucone.

netdev_max_backlog

cat /proc/sys/net/core/netdev_max_backlog

Określa maksymalną liczbę pakietów oczekujących w kolejce backlog, gdy ruch jest odbierany szybciej, niż kernel może go przetwarzać.


8. UDP socket buffer

Po przejściu przez NIC, NAPI i kernel network stack pakiet UDP musi trafić do odpowiedniego socketu.

Można to przedstawić:

NIC
 ↓
NAPI
 ↓
CPU
 ↓
kernel network stack
 ↓
UDP socket
 ↓
receive buffer
 ↓
aplikacja

Sprawdzenie parametrów:

cat /proc/sys/net/core/rmem_default
cat /proc/sys/net/core/rmem_max

rmem_default

Domyślny rozmiar receive buffer dla socketu.

rmem_max

Maksymalny rozmiar receive buffer, jaki może zostać przydzielony socketowi.

rmem_max nie oznacza, że każdy socket automatycznie otrzymuje bufor tej wielkości.


9. Dlaczego UDP jest istotne przy diagnostyce dropów?

UDP nie zapewnia retransmisji na poziomie protokołu tak jak TCP.

Jeżeli aplikacja nie odbiera danych wystarczająco szybko:

NIC
 ↓
kernel
 ↓
UDP socket buffer
 ↓
████████████████  ← pełny
 ↓
DROP

Pakiet może zostać utracony.

Dlatego przy problemach z UDP trzeba ustalić, na którym etapie następuje drop.

                    DROP
                      ↓
NIC → RX ring → NAPI → backlog → UDP socket → aplikacja
       ↑          ↑        ↑          ↑
       │          │        │          │
    ethtool    softnet   backlog    UDP stats

10. Statystyki UDP – netstat -s -u

netstat -s -u

Pokazuje statystyki protokołu UDP.

Przykładowe interesujące pola:

Udp:
    packets received
    packet receive errors
    receive buffer errors
    send buffer errors

Szczególnie ważne przy problemach z odbiorem:

  • packet receive errors
  • receive buffer errors

11. Statystyki UDP – /proc/net/snmp

Alternatywnie:

cat /proc/net/snmp | grep Udp

Typowo pojawią się dwa wiersze.

Pierwszy zawiera nazwy pól:

Udp: InDatagrams NoPorts InErrors OutDatagrams RcvbufErrors ...

Drugi zawiera wartości:

Udp: 100000 10 500 80000 400

Najważniejsze pola

InDatagrams

Liczba datagramów UDP dostarczonych do aplikacji.

NoPorts

Liczba pakietów UDP skierowanych na port, na którym nie ma nasłuchującego socketu.

InErrors

Błędy podczas odbierania UDP.

RcvbufErrors

Sytuacje, w których nie udało się umieścić odebranego datagramu w buforze odbiorczym socketu.

Jeżeli RcvbufErrors rośnie podczas problemu, warto sprawdzić:

  • rozmiar receive buffer,
  • szybkość odbierania danych przez aplikację,
  • obciążenie CPU,
  • wcześniejsze etapy ścieżki pakietu.

12. netstat -i

netstat -i

Pokazuje podstawowe statystyki interfejsów sieciowych.

Przykładowe kolumny:

Iface    MTU   RX-OK RX-ERR RX-DRP TX-OK TX-ERR TX-DRP
ens1f1   1500  ...

Najważniejsze przy odbiorze:

  • RX-OK – poprawnie odebrane pakiety,
  • RX-ERR – błędy odbioru,
  • RX-DRP – odrzucone pakiety.

Do szczegółowej diagnostyki NIC lepsze jest:

ethtool -S ens1f1

ponieważ pokazuje znacznie więcej informacji zależnych od karty i sterownika.


13. Najważniejsza zasada diagnostyczna – obserwuj przyrosty

Nie należy patrzeć tylko na aktualną wartość licznika.

Najważniejszy jest przyrost licznika podczas występowania problemu.

Przykład:

START
RcvbufErrors = 1000

test przez 60 sekund

KONIEC
RcvbufErrors = 1000

Brak nowych błędów receive buffer.

Natomiast:

START
RcvbufErrors = 1000

test przez 60 sekund

KONIEC
RcvbufErrors = 150000

oznacza:

150000 - 1000 = 149000

nowych problemów z receive buffer UDP.

To jest znacznie bardziej wartościowa informacja diagnostyczna niż sama wartość:

rmem_max = 212992

14. Praktyczna procedura diagnostyczna UDP

Podczas występowania problemu warto zebrać:

NIC

ethtool -g ens1f1

ethtool -S ens1f1 | grep -Ei 'drop|miss|error|discard'

CPU / softnet

cat /proc/net/softnet_stat

Parametry NAPI

cat /proc/sys/net/core/netdev_budget
cat /proc/sys/net/core/dev_weight

Backlog

cat /proc/sys/net/core/netdev_max_backlog
cat /proc/net/softnet_stat

UDP

netstat -s -u

lub:

cat /proc/net/snmp | grep Udp

Socket buffers

cat /proc/sys/net/core/rmem_default
cat /proc/sys/net/core/rmem_max

15. Jak znaleźć miejsce występowania dropów?

Ogólny model:

                 ┌── RX drop / miss
                 │
                 ▼
NIC → RX ring → NAPI → softnet/backlog → UDP socket → aplikacja
                  │          │              │
                  │          │              │
             softnet      backlog       RcvbufErrors

Jeżeli rosną liczniki NIC

Sprawdzaj:

ethtool -S

Podejrzenie:

  • przepełnienie RX ring,
  • problem sterownika,
  • problem sprzętowy,
  • zbyt duży napływ ruchu,
  • niewystarczająca obsługa przez CPU.

Jeżeli problem widać w softnet_stat

Sprawdzaj:

  • obciążenie CPU,
  • rozkład ruchu pomiędzy CPU,
  • NAPI,
  • netdev_budget,
  • dev_weight.

Jeżeli problem dotyczy backlog

Sprawdzaj:

cat /proc/sys/net/core/netdev_max_backlog

oraz statystyki softnet_stat.

Jeżeli rośnie RcvbufErrors

Sprawdzaj:

cat /proc/sys/net/core/rmem_default
cat /proc/sys/net/core/rmem_max

oraz przede wszystkim:

  • czy aplikacja nadąża odbierać UDP,
  • czy socket receive buffer nie jest za mały,
  • czy CPU nie jest przeciążone.

16. Ściąga

Element Komenda Co sprawdzamy
RX/TX ring ethtool -g ens1f1 rozmiar kolejek NIC
Statystyki NIC ethtool -S ens1f1 dropy, miss, błędy
Softnet cat /proc/net/softnet_stat przetwarzanie przez CPU/NAPI
NAPI budget cat /proc/sys/net/core/netdev_budget budżet pracy NAPI
NAPI weight cat /proc/sys/net/core/dev_weight domyślna waga NAPI
Backlog cat /proc/sys/net/core/netdev_max_backlog rozmiar kolejki backlog
UDP netstat -s -u błędy UDP
UDP cat /proc/net/snmp | grep Udp InErrors, RcvbufErrors
Interface netstat -i RX/TX OK, ERR, DRP
Socket buffer rmem_default domyślny receive buffer
Socket buffer rmem_max maksymalny receive buffer

Najważniejszy model

NIC
 ↓
RX ring
 ↓
NAPI
 ↓
CPU / softirq
 ↓
softnet / backlog
 ↓
UDP network stack
 ↓
UDP socket buffer
 ↓
aplikacja

Przy problemie z UDP należy ustalić, na którym z tych etapów pakiety są gubione.