Tengo una hipótesis: a veces las conexiones TCP llegan más rápido que mi servidor accept()
. Hacen cola hasta que la cola se desborda y luego hay problemas.
¿Cómo puedo confirmar que esto está sucediendo?
¿Puedo monitorear la longitud de la cola de aceptación o el número de desbordamientos? ¿Hay un mostrador expuesto en alguna parte?
linux
networking
monitoring
Phil Frost
fuente
fuente
netstat
.netstat
solo muestra las longitudes de la cola de envío y recepción, que no es lo mismo que la cola de aceptación.man netstat | less +/Flags
netstat
, no parece mostrarseFlags
en absoluto para las conexiones TCP. A partir de una pequeña prueba, parece que las conexiones se muestran comoESTABLISHED
ennetstat
, incluso si trato de abrir conexiones a un proceso que lo hacelisten()
pero nuncaaccept()
.SYN_RECV
embargo, para TCP podría contar . No hay otra cola más allá de eso. Supongo que se le puede decir al kernel de alguna manera que registre los paquetes descartados debido a demasiadas conexiones entreabiertas, pero han pasado más de 10 años desde que examiné las redes con Linux, así que no tengo idea de cómo hacerlo. En una nota al margen: no está esperandoaccept()
que haga su trabajo, está esperandoACK
que lleguen s de los hosts de conexión para completar las conexiones.Respuestas:
Para verificar si su cola se desborda, use netstat o nstat
Referencia: https://perfchron.com/2015/12/26/investigating-linux-network-issues-with-netstat-and-nstat/
Para monitorear los tamaños de las colas, use el comando ss y busque enchufes SYN-RECV.
Referencia: https://blog.cloudflare.com/syn-packet-handling-in-the-wild/
fuente
Sysdig proporcionará parte de esta información al final de cada
accept
llamada al sistema, comoqueuelen
argumento. También muestra la longitud de la cola comoqueuemax
.Que yo sepa, no proporciona ningún mecanismo para saber exactamente cuándo o cuántas veces se ha desbordado la cola. Y sería engorroso integrar esto con monitoreo periódico por
collectd
o similar.fuente
Lo que está buscando es la entrada en la salida del comando sysctl -a como tal :::
net.ipv4.tcp_max_sync_backlog = 4096
En el caso del ejemplo anterior, el retraso de las conexiones de estado SYN es máximo 4096. Puede aumentar eso en función de la cantidad de RAM que hay en su servidor. Considero que la acumulación de 32K es un buen comienzo para el ajuste de servidores web con mucha carga.
También asegúrese de que lo siguiente NO esté establecido en One (1) ::
net.ipv4.tcp_abort_on_overflow = 0
De lo contrario, definitivamente descartará los paquetes si hay un desbordamiento de la acumulación.
Puede verificar fácilmente a través de
"acumulación de sysctl -a | egrep"
"sysctl -a | desbordamiento de egrep"
Además, puede encontrar la etiqueta "descartada" debajo de
"ifconfig -a"
salida del comando. Eso muestra cuántos paquetes se descartaron para cada interfaz junto con otros datos y errores, etc.
Para registrar paquetes descartados hay un artículo de paywall en RHEL 7 ::
https://access.redhat.com/solutions/1191593
Para más investigación, puede leer:
http://veithen.io/2014/01/01/how-tcp-backlog-works-in-linux.html
Establece aquí según Steven's Book Illustrated TCP / IP:
"El límite de la cola se aplica a la suma de [...] el número de entradas en la cola de conexión incompleta [...] y [...] el número de entradas en la cola de conexión completa [...]".
Por lo tanto, también establece que:
"La cola de conexión completada casi siempre está vacía porque cuando se coloca una entrada en esta cola, la llamada del servidor para aceptar regresa y el servidor retira la conexión completa de la cola".
Por lo tanto, la cola de aceptación puede parecer completamente vacía y tendrá que ajustar su (posiblemente en este caso) servidor Web Apache para aceptar más rápidamente las conexiones ubicadas en la cola "total agregada".
fuente