sockets - ¿El docker bloquea las conexiones salientes en carga alta?
http tcp (1)
Tenemos un servidor web node.js que realiza algunas solicitudes http salientes a una API externa. Se está ejecutando en docker utilizando dokku .
Después de un tiempo de carga (30req / s) estas solicitudes salientes ya no están recibiendo respuestas.
Aquí hay un gráfico que hice mientras probaba con constante req / s: incoming
y outgoing
es la cantidad de solicitudes simultáneas (no la cantidad de solicitudes inicializadas). (Es difícil verlo en el gráfico, pero es bastante constante en ~ 10 solicitudes para cada uno).
response time
es solo para solicitudes externas. Puede ver claramente que comienzan a fallar repentinamente (alcanzando nuestro tiempo de espera de 1000 ms).
Cuanto más req / s enviamos, más rápido nos encontramos con este problema, por lo que debemos tener algún tipo de límite al que nos estamos acercando con cada solicitud.
Utilicé netstat -ant | tail -n +3 | wc -l
netstat -ant | tail -n +3 | wc -l
netstat -ant | tail -n +3 | wc -l
en el host para obtener el número de conexiones abiertas, pero solo fue ~ 450 (la mayoría de ellas TIME_WAIT
). Eso no debería llegar al límite de socket. No estamos llegando a ningún límite de RAM o CPU, tampoco.
También intenté ejecutar la misma aplicación en la misma máquina fuera de la ventana acoplable y solo ocurre en la ventana acoplable .
Podría ser debido al proxy de Docker userland. Si está ejecutando una versión reciente de Docker, intente ejecutar el daemon con la --userland-proxy=false
. Esto hará que Docker maneje el reenvío de puertos solo con iptables y habrá menos gastos generales.