Estoy trabajando en un software que se conecta a un servidor de datos en tiempo real (usando TCP) y tengo algunas conexiones caídas. Supongo que los clientes no leen los datos que provienen del servidor lo suficientemente rápido. Por lo tanto, me gustaría monitorear mis sockets TCP. Para esto encontré la herramienta "ss".
Esta herramienta permite ver el estado de cada socket: aquí hay una línea de ejemplo de la salida del comando 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
Mi pregunta es: ¿qué significa la parte de memoria? Mirando el código fuente de la herramienta, descubrí que los datos provienen de una estructura del núcleo ( sock
in sock.h
). Más precisamente, proviene de los campos:
r = sk->sk_rmem_alloc
w = sk->sk_wmem_queued;
f = sk->sk_forward_alloc;
t = sk->sk_wmem_alloc;
¿Alguien sabe lo que significan? Mis conjeturas son:
rmem_alloc
: tamaño del búfer entrantewmem_alloc
: tamaño del búfer de salidask_forward_alloc
: ???sk->sk_wmem_queued
: ???
Aquí están mis tamaños de tampones:
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
Respuestas:
sk_forward_alloc
es la memoria asignada hacia adelante, que es la memoria total actualmente disponible en la cuota del socket.sk_wmem_queued
es la cantidad de memoria utilizada por el búfer de envío de socket en cola en la cola de transmisión y aún no se ha enviado o aún no se ha reconocido.Puede obtener más información sobre la gestión de la memoria TCP en el capítulo 9 de Arquitectura, diseño e implementación de TCP / IP en Linux Por Sameer Seth, M. Ajaykumar Venkatesulu
fuente
sk_wmem_queued
difiere esta definición desk_wmem_alloc
, ¿podría ampliar un poco sobre esto? (Si conoce la respuesta, siéntase libre de agregar una respuesta a esta pregunta: unix.stackexchange.com/questions/551444/… )Vea la página de manual de ss.
fuente
Con respecto
sk_wmem_queued
ysk_wmem_alloc
, me hice la misma pregunta por lo que voy a copiar la respuesta aquí:Le envié un correo electrónico a Eric Dumazet, quien contribuye a la pila de red de Linux, y aquí está la respuesta:
Un muy buen documento para comprender cuáles son estos tres tipos de colas (buffer de socket, cola qdisc y cola de dispositivo) es este artículo (bastante largo) . En pocas palabras, el socket comienza empujando los paquetes directamente en la cola qdisc, que los reenvía a la cola del dispositivo. Cuando la cola qdisc está llena, el socket comienza a almacenar los datos en su propia cola de escritura.
Básicamente:
sk_wmem_queues
es la memoria utilizada por el buffer buffer (sock.sk_write_queue
) mientras quesk_wmem_alloc
es la memoria utilizada por los paquetes en las colas qdisc y dispositivo.fuente