So überprüfen Sie die RX-Ring-, Max_Backlog- und Max_Syn_Backlog-Größe

41

Sehr oft denke ich bei der Fehlerbehebung und Optimierung über die folgenden Linux-Kernel-Einstellungen nach:

net.core.netdev_max_backlog
net.ipv4.tcp_max_syn_backlog
net.core.somaxconn

Anders als fs.file-max, net.ipv4.ip_local_port_range, net.core.rmem_max, net.core.wmem_max, net.ipv4.tcp_rmem, und net.ipv4.tcp_wmem, so scheint sie die wichtige Knöpfe zu verwirren , um mit , wenn Sie ein Feld für eine hohes Maß an Parallelität zu stimmen.

Meine Frage: Wie kann ich überprüfen, wie viele Elemente sich in jeder dieser Warteschlangen befinden? Normalerweise setzen die Leute sie einfach auf ein Superhoch, aber ich möchte diese Warteschlangengrößen protokollieren, um zukünftige Fehler vorherzusagen und Probleme zu erkennen, bevor sie sich auf eine vom Benutzer wahrnehmbare Weise manifestieren.

Colin Hostert
quelle
Das ist eine wunderbare Frage. Ich interessiere mich für das Incast-Problem und für hochauflösende TCP-Neuübertragungen.
dhchdhd

Antworten:

29

Auch ich habe mich darüber gewundert und war von Ihrer Frage motiviert!

Ich habe zusammengetragen, wie nahe ich an jede der von Ihnen aufgelisteten Warteschlangen herankommen könnte, und habe einige Informationen zu den einzelnen Warteschlangen zusammengetragen. Ich freue mich über Kommentare und Feedback. Jede Verbesserung der Überwachung erleichtert die Verwaltung!

net.core.somaxconn

net.ipv4.tcp_max_syn_backlog

net.core.netdev_max_backlog

$ netstat -an | grep -c SYN_RECV 

Zeigt die aktuelle globale Anzahl der Verbindungen in der Warteschlange an. Sie können diese Anzahl pro Port aufteilen und in exec-Anweisungen in der Datei snmpd.conf einfügen, wenn Sie sie von einer Überwachungsanwendung abrufen möchten.

Von:

netstat -s

Diese zeigen Ihnen, wie oft Sie Anfragen aus der Warteschlange sehen:

146533724 packets directly received from backlog
TCPBacklogDrop: 1029
3805 packets collapsed in receive queue due to low socket buffer

fs.file-max

Von:

http://linux.die.net/man/5/proc

$ cat /proc/sys/fs/file-nr
2720    0       197774

Diese (schreibgeschützte) Datei gibt die Anzahl der aktuell geöffneten Dateien an. Es enthält drei Zahlen: Die Anzahl der zugewiesenen Dateihandles, die Anzahl der freien Dateihandles und die maximale Anzahl der Dateihandles.

net.ipv4.ip_local_port_range

Wenn Sie eine Ausschlussliste von Diensten erstellen können (netstat -an | grep LISTEN), können Sie ableiten, wie viele Verbindungen für kurzlebige Aktivitäten verwendet werden:

netstat -an | egrep -v "MYIP.(PORTS|IN|LISTEN)"  | wc -l

Sollte auch überwachen (von SNMP):

TCP-MIB::tcpCurrEstab.0

Es kann auch interessant sein, Statistiken über alle in diesem Baum angezeigten Zustände zu sammeln (established / time_wait / fin_wait / etc):

TCP-MIB::tcpConnState.*

net.core.rmem_max

net.core.wmem_max

Sie müssten Ihr System für setsockopt-Anforderungen verfolgen / stracen. Ich denke nicht, dass Statistiken für diese Anfragen anderweitig erfasst werden. Dies ist kein Wert, der sich nach meinem Verständnis ändert. Die Anwendung, die Sie bereitgestellt haben, wird wahrscheinlich nach einem Standardbetrag fragen. Ich denke, Sie könnten Ihre Anwendung mit strace "profilieren" und diesen Wert entsprechend konfigurieren. (diskutieren?)

net.ipv4.tcp_rmem

net.ipv4.tcp_wmem

Um zu verfolgen, wie nahe Sie am Limit sind, müssten Sie den Durchschnitt und das Maximum der Felder tx_queue und rx_queue von (regelmäßig) anzeigen:

# cat /proc/net/tcp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                                                     
   0: 00000000:0FB1 00000000:0000 0A 00000000:00000000 00:00000000 00000000   500        0 262030037 1 ffff810759630d80 3000 0 0 2 -1                
   1: 00000000:A133 00000000:0000 0A 00000000:00000000 00:00000000 00000000   500        0 262029925 1 ffff81076d1958c0 3000 0 0 2 -1                

Um diesbezügliche Fehler zu verfolgen:

# netstat -s
    40 packets pruned from receive queue because of socket buffer overrun

Sollte auch den globalen Pufferpool überwachen (über SNMP):

HOST-RESOURCES-MIB::hrStorageDescr.1 = STRING: Memory Buffers
HOST-RESOURCES-MIB::hrStorageSize.1 = INTEGER: 74172456
HOST-RESOURCES-MIB::hrStorageUsed.1 = INTEGER: 51629704
Polynom
quelle
2

Möglicherweise können Sie diese Daten mit SystemTap abrufen. Hier ist das Redhat Referenzhandbuch (pdf) . Es gibt auch einen Anfängerleitfaden (pdf) .

Das Tool sieht so vielseitig aus, dass Sie diese Daten abrufen können. Insbesondere probe::netdev.rxsieht es so aus, als würden Sie Informationen zu eingehenden Einträgen erhalten. Jetzt müssen Sie "nur" die Nettogröße der Warteschlange im Puffer ermitteln oder etwas, das zählt die Warteschlange verlassen ...

Paweł Brodacki
quelle