cómo verificar el tamaño del anillo rx, max_backlog y max_syn_backlog

41

Muy a menudo, en el curso de la resolución de problemas y ajustes, me encuentro pensando en la siguiente configuración del kernel de Linux:

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

Aparte fs.file-max, net.ipv4.ip_local_port_range, net.core.rmem_max, net.core.wmem_max, net.ipv4.tcp_rmem, y net.ipv4.tcp_wmem, parece ser que los mandos importantes para meterse con cuando se está sintonizando una caja para un alto nivel de concurrencia.

Mi pregunta: ¿Cómo puedo verificar para ver cuántos elementos hay en cada una de esas colas? Por lo general, las personas simplemente los configuran súper alto, pero me gustaría registrar esos tamaños de cola para ayudar a predecir fallas futuras y detectar problemas antes de que se manifiesten de manera notable para el usuario.

Colin Hostert
fuente
Esta es una pregunta asombrosa. Estoy interesado en el problema de incast y las retransmisiones TCP de alta resolución.
dhchdhd

Respuestas:

29

¡Yo también me he preguntado esto y su pregunta me motivó!

He recopilado qué tan cerca podría estar de cada una de las colas que enumeró con información relacionada con cada una. Agradezco comentarios / comentarios, cualquier mejora en el monitoreo hace que las cosas sean más fáciles de administrar.

net.core.somaxconn

net.ipv4.tcp_max_syn_backlog

net.core.netdev_max_backlog

$ netstat -an | grep -c SYN_RECV 

Mostrará el recuento global actual de conexiones en la cola, puede dividir esto por puerto y poner esto en declaraciones ejecutivas en snmpd.conf si desea sondearlo desde una aplicación de monitoreo.

Desde:

netstat -s

Estos le mostrarán con qué frecuencia está viendo solicitudes de la cola:

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

fs.file-max

Desde:

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

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

Este archivo (de solo lectura) proporciona la cantidad de archivos actualmente abiertos. Contiene tres números: el número de identificadores de archivos asignados, el número de identificadores de archivos libres y el número máximo de identificadores de archivos.

net.ipv4.ip_local_port_range

Si puede crear una lista de servicios de exclusión (netstat -an | grep LISTEN), puede deducir cuántas conexiones se están utilizando para la actividad efímera:

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

También debe monitorear (desde SNMP):

TCP-MIB::tcpCurrEstab.0

También puede ser interesante recopilar estadísticas sobre todos los estados vistos en este árbol (establecido / time_wait / fin_wait / etc):

TCP-MIB::tcpConnState.*

net.core.rmem_max

net.core.wmem_max

Tendría que trazar / estratificar su sistema para solicitudes setsockopt. No creo que las estadísticas de estas solicitudes se rastreen de otra manera. Esto no es realmente un valor que cambie desde mi comprensión. La aplicación que ha implementado probablemente le pedirá una cantidad estándar. Creo que podría 'perfilar' su aplicación con strace y configurar este valor en consecuencia. (¿discutir?)

net.ipv4.tcp_rmem

net.ipv4.tcp_wmem

Para realizar un seguimiento de lo cerca que está del límite, debe mirar el promedio y el máximo de los campos tx_queue y rx_queue (de forma regular):

# 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                

Para rastrear errores relacionados con esto:

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

También debe estar monitoreando el grupo global 'buffer' (a través de SNMP):

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

Creo que puede obtener esos datos con SystemTap. Aquí está el manual de referencia de Redhat (pdf) . También hay una guía para principiantes (pdf) .

La herramienta se ve lo suficientemente versátil como para permitirle obtener esos datos, en particular se probe::netdev.rxparece a algo que le dará información sobre las entradas entrantes, ahora "solo" necesita encontrar el tamaño neto de la cola en el búfer o algo que cuente cosas dejando la cola ...

Paweł Brodacki
fuente