Tengo un servidor web que se ejecuta dentro de un contenedor docker en la instancia de AWS EC2 Ubuntu. Cuando envío solicitudes al servidor web, obtengo la respuesta muy lentamente (más de 20 segundos la mayoría de las veces, aunque el tiempo de respuesta varía). Sin embargo, no se agota el tiempo . El servidor web es muy ligero. Es solo para probar, por lo que casi no hace nada.
docker version 17.03.0-ce docker-compose version 1.12.0-rc1
Cuando se envían solicitudes al servidor web que se ejecuta en el contenedor acoplable desde la instancia EC2 (url = ' http:// localhost:xxxx/api '), sigue siendo muy lento. Por lo tanto, no debe estar relacionado con el envío de solicitudes desde el exterior.
Ejecuto otro servidor web dentro de EC2 directamente (no en un contenedor docker) y no es lento . Responde muy rápido.
Ejecuto otro servidor web dentro de otro contenedor docker en EC2, ¡y también es muy lento!
Cuando envío la solicitud desde el interior del contenedor docker al servidor web que se ejecuta en él (en su host local), ¡ también es muy lento !
¡Ejecuto los contenedores con el mismo comando en mi computadora Mac y la respuesta de obtención no es lenta!
Aquí está una de las estadísticas de los contenedores:
CPU %: 0.28% MEM USAGE / LIMIT: 27.49 MiB / 992.5 MiB MEM %: 2.77% NET I/O: 53.7 kB / 30.5 kB BLOCK I/O: 2.24 MB / 0 B
Entiendo que puede ser muy difícil saber el problema. Mi pregunta son los pasos para depurar la causa y finalmente encontrar la solución. Agradezco si pudiera explicar su enfoque en detalle.
Esto suena como un problema de resolución de nombres. Para depurar esto, puedes hacer cosas diferentes.
Primero puede iniciar un servidor tcp simple con nc -l -p 8000
dentro del contenedor docker (que se inicia -p 8000:8000
), y luego en el lanzamiento del host: nc 127.0.0.1 8000
, escriba algún carácter, vea si el La comunicación TCP funciona, deberían aparecer dentro del contenedor.
A continuación, puede hacer lo mismo que antes pero usando "localhost" en lugar de 127.0.0.1
Después de esto, puede hacer la misma solicitud HTTP que hizo, pero usando 127.0.0.1
en lugar de localhost
(esto establecerá el encabezado Host:
de la solicitud en el mismo valor, que el servidor web podría no verificar o podría resolver más fácilmente).
También puede echar un vistazo a /etc/hosts
y /etc/resolv.conf
dentro del contenedor. Tal vez no tengan sentido en el contexto de red de su contenedor.
Además, puede medir con precisión el tiempo necesario para sus solicitudes, si están cerca de un segundo preciso, esto suena una vez más como un tiempo de espera de DNS (si es 5.003, 10.200, 20.030 segundos, es como un tiempo de espera de X segundos, más el tiempo real necesario para responder).