Je travaille sur un logiciel qui se connecte à un serveur de données en temps réel (en utilisant TCP) et j'ai quelques connexions qui tombent. Je suppose que les clients ne lisent pas assez rapidement les données provenant du serveur. Par conséquent, je voudrais surveiller mes sockets TCP. Pour cela j'ai trouvé l'outil "ss".
Cet outil permet de voir l'état de chaque socket - voici un exemple de ligne de sortie de la commande 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
Ma question est: que signifie la partie mémoire? En regardant le code source de l'outil, j'ai constaté que les données proviennent d'une structure de noyau ( sock
en sock.h
). Plus précisément, il provient des domaines:
r = sk->sk_rmem_alloc
w = sk->sk_wmem_queued;
f = sk->sk_forward_alloc;
t = sk->sk_wmem_alloc;
Quelqu'un sait-il ce qu'il veut dire? Mes suppositions sont:
rmem_alloc
: taille du tampon entrantwmem_alloc
: taille du tampon sortantsk_forward_alloc
: ???sk->sk_wmem_queued
: ???
Voici mes tailles de tampons:
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
Réponses:
sk_forward_alloc
est la mémoire allouée vers l'avant qui est la mémoire totale actuellement disponible dans le quota du socket.sk_wmem_queued
est la quantité de mémoire utilisée par le tampon d'envoi de socket en file d'attente dans la file d'attente de transmission et qui n'est pas encore envoyée ou pas encore acquittée.Vous pouvez en savoir plus sur la gestion de la mémoire TCP dans le chapitre 9 de l'architecture, la conception et la mise en œuvre TCP / IP sous Linux par Sameer Seth, M. Ajaykumar Venkatesulu
la source
sk_wmem_queued
diffère desk_wmem_alloc
, pourriez-vous développer un peu ce point? (Si vous connaissez la réponse, n'hésitez pas à ajouter une réponse à cette question: unix.stackexchange.com/questions/551444/… )Voir la page de manuel des art.
la source
En ce qui concerne
sk_wmem_queued
etsk_wmem_alloc
, j'ai posé la même question donc je vais copier la réponse ici:J'ai envoyé un e-mail à Eric Dumazet, qui contribue à la pile réseau Linux, et voici la réponse:
Un très bon document pour comprendre ce que sont ces trois types de files d'attente (tampon de socket, file d'attente qdisc et file d'attente de périphériques) est cet article (plutôt long) . En résumé, le socket commence par pousser les paquets directement dans la file d'attente qdisc, qui les transmet à la file d'attente des périphériques. Lorsque la file d'attente qdisc est pleine, le socket commence la mise en mémoire tampon des données dans sa propre file d'attente d'écriture.
Donc, fondamentalement:
sk_wmem_queues
est la mémoire utilisée par le tampon de socket (sock.sk_write_queue
) tandis quesk_wmem_alloc
la mémoire est utilisée par les paquets dans les files d'attente qdisc et device.la source