1

我有一个应用程序,我注意到在发出传出 HTTP 请求时性能很差(额外延迟 5 秒)。通过大量的试验/测试,我意识到将应用程序从 docker 移到主机中可以消除奇怪的 HTTP 延迟。

我将 alpine linux 用于 docker 映像,而 ubuntu 正在托管父计算机。

码头工人信息:

Docker 版本 1.11.2,构建 b9f10c9

      "NetworkSettings": {
        "Bridge": "",
        "SandboxID": "3ab81b8a66a99c6e9b1a1f49c5410d8260db37eee96c9231c0d83c1b40f84fa5",
        "HairpinMode": false,
        "LinkLocalIPv6Address": "",
        "LinkLocalIPv6PrefixLen": 0,
        "Ports": {
            "8084/tcp": null
        },
        "SandboxKey": "/var/run/docker/netns/3ab81b8a66a9",
        "SecondaryIPAddresses": null,
        "SecondaryIPv6Addresses": null,

        "EndpointID": "464acfb299941bbd301051ea05451823a7e527161185570c00f8569ce2afde88",
        "Gateway": "172.17.0.1",
        "GlobalIPv6Address": "",
        "GlobalIPv6PrefixLen": 0,
        "IPAddress": "172.17.0.3",
        "IPPrefixLen": 16,
        "IPv6Gateway": "",
        "MacAddress": "02:42:ac:11:00:03",
        "Networks": {
            "bridge": {
                "IPAMConfig": null,
                "Links": null,
                "Aliases": null,
                "NetworkID": "32ebc75bc4c98106c6775905906723405c58bc3de914283234a8e1273cba7193",
                "EndpointID": "464acfb299941bbd301051ea05451823a7e527161185570c00f8569ce2afde88",

                "Gateway": "172.17.0.1",
                "IPAddress": "172.17.0.3",
                "IPPrefixLen": 16,
                "IPv6Gateway": "",
                "GlobalIPv6Address": "",
                "GlobalIPv6PrefixLen": 0,
                "MacAddress": "02:42:ac:11:00:03"
            }
        }
    }

我运行了 docker 容器,没有任何花哨的东西:

docker run -d test

我的代码(python)乘以整个请求周期所需的时间:

now = datetime.now()
response = http.request('POST', url, body=request_body, headers=headers)

print(
    "\nTotal Time: ",
    (datetime.now() - now).total_seconds()
)

恒定时间为 5-6 秒,在容器外,不到一秒。

我做了一个练习来检查容器内部的 DNS 和 tcpdump。从那里报告似乎没有什么有趣的事情。DNS 看起来不错,数据包捕获报告请求时间为 0.2 秒。

我从数据包捕获中发现的唯一有趣的事情是,从调用 http.request 开始,需要 5 秒才能看到数据包的开头。

我确信这里某处存在 docker 网络配置错误。如果我需要添加更多信息,请告诉我。我们正在将 docker 用于 20 个其他服务而没有这个问题。

谢谢!

4

1 回答 1

3

我不知道你是否还需要这些信息。我们已经看到了类似的情况,通过升级 Docker 解决了这个问题。

不知道问题的原因导致我做了一些挖掘,我发现了这个:

https://github.com/docker/docker/issues/20661

简而言之,它与 docker 在尝试对 ipv4 做同样的事情之前尝试解析 ipv6 dns 有关。读一读。你可能比我更了解它。

我希望它对你有帮助。

于 2016-09-09T16:14:49.737 回答