Ubuntu Server 10.04.1 x86
Tengo una máquina con un servicio HTTP FCGI detrás de nginx, que atiende muchas solicitudes HTTP pequeñas a muchos clientes diferentes. (Aproximadamente 230 solicitudes por segundo en las horas pico, el tamaño promedio de respuesta con encabezados es de 650 bytes, varios millones de clientes diferentes por día).
Como resultado, tengo muchos sockets, colgando en TIME_WAIT (el gráfico se captura con la configuración de TCP a continuación):
Me gustaría reducir la cantidad de enchufes.
¿Qué puedo hacer además de esto?
$ cat / proc / sys / net / ipv4 / tcp_fin_timeout 1 $ cat / proc / sys / net / ipv4 / tcp_tw_recycle 1 $ cat / proc / sys / net / ipv4 / tcp_tw_reuse 1
Actualización: algunos detalles sobre el diseño del servicio real en la máquina:
cliente ----- TCP-socket -> nginx (proxy inverso del equilibrador de carga) ----- TCP-socket -> nginx (trabajador) --domain-socket -> fcgi-software - socket TCP persistente simple -> Redis - socket TCP-persistente simple -> MySQL (otra máquina)
Probablemente debería cambiar el equilibrador de carga -> la conexión del trabajador a los sockets de dominio también, pero el problema sobre los sockets TIME_WAIT persistiría - planeo agregar un segundo trabajador en una máquina separada pronto. No podrá utilizar sockets de dominio en ese caso.
fuente
Respuestas:
Una cosa que debes hacer para comenzar es arreglar el
net.ipv4.tcp_fin_timeout=1
. Eso es demasiado bajo, probablemente no debería tomar mucho menos de 30.Ya que esto está detrás de nginx. ¿Eso significa que nginx está actuando como un proxy inverso? Si ese es el caso, entonces sus conexiones son 2x (una al cliente, una a sus servidores web). ¿Sabes a qué extremo pertenecen estos enchufes?
Actualización:
fin_timeout es cuánto tiempo permanecen en FIN-WAIT-2 (De
networking/ip-sysctl.txt
en la documentación del kernel):Creo que quizás solo tenga que dejar que Linux mantenga el número de socket TIME_WAIT en contra de lo que parece ser un límite de 32k en ellos y aquí es donde Linux los recicla. Se alude a este 32k en este enlace :
Este enlace también sugiere que el estado TIME_WAIT es de 60 segundos y no se puede ajustar a través de proc.
Dato
curioso al azar: puede ver los temporizadores en el tiempo de espera con netstat para cada socket con
netstat -on | grep TIME_WAIT | less
Reuse Vs Recycle:
estos son algo interesantes, se lee como reutilizar, habilitar la reutilización de los sockets time_Wait y reciclar lo pone en modo TURBO:
No recomendaría usar net.ipv4.tcp_tw_recycle ya que causa problemas con los clientes NAT .
¿Tal vez podría intentar no tener ambos encendidos y ver qué efecto tiene (Pruebe uno a la vez y vea cómo funcionan por su cuenta)? Lo usaría
netstat -n | grep TIME_WAIT | wc -l
para obtener comentarios más rápidos que Munin.fuente
net.ipv4.tcp_fin_timeout
recomendarías?30
o tal vez20
. Pruébalo y verás. Tiene mucha carga, por lo que tiene mucho sentido TIME_WAIT.net.ipv4.tcp_fin_timeout
de1
a20
?netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c
. Entonces, @Alex, si a Munin no le gusta, tal vez profundice en cómo monitorea estas estadísticas. Tal vez el único problema es que Munin te está dando malos datos :-)tcp_tw_reuse es relativamente seguro ya que permite reutilizar las conexiones TIME_WAIT.
También podría ejecutar más servicios escuchando en diferentes puertos detrás de su equilibrador de carga si quedarse sin puertos es un problema.
fuente