在EC2实例内部运行的docker容器内运行的Web服务器响应非常缓慢

时间:2017-03-23 21:02:24

标签: performance docker amazon-ec2 docker-container response-time

我在AWS EC2 Ubuntu实例中的docker容器内运行了一个Web服务器。当我向Web服务器发送请求时,我得到的响应非常缓慢(大多数时间超过20秒,尽管响应时间不同)。 虽然不会超时。 Web服务器非常轻量级。它只是为了测试,所以几乎什么都不做。

docker version 17.03.0-ce

docker-compose version 1.12.0-rc1

到目前为止我的调试方式

  1. 当从EC2实例中的 (url ='http:// localhost:xxxx / api')向Docker容器中运行的Web服务器发送请求时,它仍然很慢。所以不应该与从外部发送请求有关。

  2. 我在EC2中直接运行 (不在Docker容器中), 即可。它反应非常迅速。

  3. 我在EC2中的另一个Docker容器中运行另一个Web服务器它也非常慢!

  4. 当我将来自docker容器中的的请求发送到其中运行的Web服务器(在其localhost中)时,它也非常慢

  5. 我在Mac计算机上使用相同的命令运行容器,获取响应并不慢!

  6. 以下是其中一个容器统计信息:

    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
    

    我知道可能很难知道这个问题。我的问题是调试原因并最终找到解决方案的步骤。如果您能详细解释您的方法,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

这听起来像名称解析问题。 要调试它,你可以做不同的事情。

  • 您可以先在docker容器(已启动nc -l -p 8000)中启动一个简单的tcp服务器-p 8000:8000,然后在主机启动时启动nc 127.0.0.1 8000,输入一些charachter,看看TCP通信是否有效,它们应该出现在容器中。

  • 接下来,您可以像以前一样使用“localhost”代替127.0.0.1

  • 在此之后,您可以执行相同的HTTP请求,但使用127.0.0.1代替localhost(这会将请求的Host:标头设置为相同的值,网络服务器可能无法检查,或者可能更容易解决。)

您还可以查看容器中生成的/etc/hosts/etc/resolv.conf。也许它们在容器的网络环境中没有意义。

此外,您可以精确测量您的请求所需的时间,如果它们接近精确的秒数,这听起来更像DNS超时(如果它是5.003,10.200,20.030秒,它就像X秒超时,加上回应所需的实时时间)。