将应用程序从主机移动到 docker 会使 HTTP 延迟增加 5 秒
Moving app to docker from host increases HTTP lag by 5 seconds
我注意到我有一个应用程序在发出传出 HTTP 请求时表现不佳(额外延迟 5 秒)。通过大量试验/测试,我意识到将应用程序从 docker 移到主机中可以消除奇怪的 HTTP 延迟。
我正在为 docker 图像使用 alpine linux,并且 ubuntu 正在托管父计算机。
Docker 信息:
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 网络配置错误。如果我需要添加更多信息,请告诉我。我们正在为 20 个其他服务使用 docker 而没有这个问题。
谢谢!
我不知道你是否还需要这些信息。我们已经看到类似的情况,通过升级 Docker.
解决了
不知道问题的原因导致我做了一点挖掘,我发现了这个:
https://github.com/docker/docker/issues/20661
简而言之,它与 docker 在尝试对 ipv4 执行相同操作之前尝试解析 ipv6 dns 有关。读一读。你可能比我更明白。
希望对你有所帮助
我注意到我有一个应用程序在发出传出 HTTP 请求时表现不佳(额外延迟 5 秒)。通过大量试验/测试,我意识到将应用程序从 docker 移到主机中可以消除奇怪的 HTTP 延迟。
我正在为 docker 图像使用 alpine linux,并且 ubuntu 正在托管父计算机。
Docker 信息:
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 网络配置错误。如果我需要添加更多信息,请告诉我。我们正在为 20 个其他服务使用 docker 而没有这个问题。
谢谢!
我不知道你是否还需要这些信息。我们已经看到类似的情况,通过升级 Docker.
解决了不知道问题的原因导致我做了一点挖掘,我发现了这个:
https://github.com/docker/docker/issues/20661
简而言之,它与 docker 在尝试对 ipv4 执行相同操作之前尝试解析 ipv6 dns 有关。读一读。你可能比我更明白。
希望对你有所帮助