Ich arbeite an einer Software, die eine Verbindung zu einem Echtzeit-Datenserver (über TCP) herstellt, und es treten Verbindungsabbrüche auf. Ich vermute, dass die Clients die vom Server kommenden Daten nicht schnell genug lesen. Deshalb möchte ich meine TCP-Sockets überwachen. Dafür habe ich das "ss" Tool gefunden.
Mit diesem Tool können Sie den Status aller Sockets anzeigen. Hier ist ein Beispiel für die Ausgabe des Befehls ss -inm 'src *:50000'
ESTAB 0 0 184.7.60.2:50000 184.92.35.104:1105
mem:(r0,w0,f0,t0) sack rto:204 rtt:1.875/0.75 ato:40
Meine Frage ist: Was bedeutet der Erinnerungsteil? Beim Betrachten des Quellcodes des Tools stellte ich fest, dass die Daten aus einer Kernelstruktur ( sock
in sock.h
) stammen. Genauer gesagt kommt es von den Feldern:
r = sk->sk_rmem_alloc
w = sk->sk_wmem_queued;
f = sk->sk_forward_alloc;
t = sk->sk_wmem_alloc;
Weiß jemand, was sie bedeuten? Meine Vermutungen sind:
rmem_alloc
: Größe des Eingangspufferswmem_alloc
: Größe des ausgehenden Pufferssk_forward_alloc
: ???sk->sk_wmem_queued
: ???
Hier sind meine Puffergrößen:
net.ipv4.tcp_rmem = 4096 87380 174760
net.ipv4.tcp_wmem = 4096 16384 131072
net.ipv4.tcp_mem = 786432 1048576 1572864
net.core.rmem_default = 110592
net.core.wmem_default = 110592
net.core.rmem_max = 1048576
net.core.wmem_max = 131071
Antworten:
sk_forward_alloc
ist der vorwärts zugewiesene Speicher, der der gesamte derzeit im Socket-Kontingent verfügbare Speicher ist.sk_wmem_queued
ist die Speicherkapazität, die der Socket-Sendepuffer in der Sendewarteschlange belegt und die entweder noch nicht gesendet oder noch nicht bestätigt wurden.Weitere Informationen zur TCP-Speicherverwaltung finden Sie in Kapitel 9 der TCP / IP-Architektur, -Design und -Implementierung unter Linux. Von Sameer Seth, M. Ajaykumar Venkatesulu
quelle
sk_wmem_queued
unterscheidetsk_wmem_alloc
. Könnten Sie das etwas näher erläutern? (Wenn Sie die Antwort wissen, können Sie diese Frage gerne beantworten: unix.stackexchange.com/questions/551444/… )Siehe die Manpage von ss.
quelle
In Bezug auf
sk_wmem_queued
und habesk_wmem_alloc
ich die gleiche Frage gestellt, daher werde ich die Antwort hier kopieren:Ich habe Eric Dumazet, der zum Linux-Netzwerk-Stack beiträgt, eine E-Mail geschickt, und hier ist die Antwort:
Ein sehr gutes Dokument zum Verständnis der drei Arten von Warteschlangen (Socket-Puffer, Qdisc-Warteschlange und Gerätewarteschlange) ist dieser Artikel (ziemlich lang) . Kurz gesagt, der Socket schiebt die Pakete zunächst direkt in die qdisc-Warteschlange und leitet sie an die Gerätewarteschlange weiter. Wenn die qdisc-Warteschlange voll ist, beginnt der Socket, die Daten in seiner eigenen Schreibwarteschlange zu puffern.
Im Grunde genommen: Wird
sk_wmem_queues
der Speicher vom Socket Buffer (sock.sk_write_queue
) verwendet, währendsk_wmem_alloc
der Speicher von den Paketen in den Warteschlangen qdisc und device verwendet wird.quelle