Docker在高负载下阻止传出连接?
Posted
技术标签:
【中文标题】Docker在高负载下阻止传出连接?【英文标题】:Docker blocking outgoing connections on high load? 【发布时间】:2015-10-03 18:38:54 【问题描述】:我们有一个 node.js Web 服务器,它向外部 API 发出一些传出的 http 请求。它使用 dokku 在 docker 中运行。 经过一段时间的负载 (30req/s) 后,这些传出请求不再得到响应。
这是我在使用常量 req/s 进行测试时制作的图表:
incoming
和outgoing
是并发请求的数量(不是初始化的请求数量)。 (在图中很难看到,但每个请求大约 10 个请求相当稳定。)response time
仅适用于外部请求。
您可以清楚地看到它们开始失败突然(达到我们的 1000 毫秒超时)。
我们发送的 req/s 越多,遇到这个问题的速度就越快,所以我们必须对每个请求都有一些越来越接近的限制。
我在主机上使用netstat -ant | tail -n +3 | wc -l
来获取打开的连接数,但它只有~450(其中大部分是TIME_WAIT
)。那不应该达到套接字限制。我们也没有达到任何 RAM 或 CPU 限制。
我还尝试在 docker 之外的同一台机器上运行相同的应用程序,它只发生在 docker 中。
【问题讨论】:
你试过在 Docker 中运行它而不是在 Dokku 中运行它吗? 定义“当前处理”。 1000 毫秒对于请求超时来说太短了。尝试一些有意义的事情,比如十秒钟。 @maybeg 我没有,因为 dokku 的人告诉我他们没有接触任何网络事物。我稍后会尝试。 @EJP 1000ms 实际上对于外部 API 请求来说已经很多了。不过,当我把它变长时,结果并没有什么不同。 (而且我们的用户都没有等待 10 秒以上的时间来完成 HTTP 请求) @jomo 实际上并不多。您在 TCP 重试超时范围内。太短了。 【参考方案1】:这可能是由于 Docker 用户空间代理。如果您正在运行最新版本的 Docker,请尝试使用 --userland-proxy=false
选项运行守护程序。这将使 Docker 仅使用 iptables 处理端口转发,并且开销更少。
【讨论】:
我刚试过这个,好像没什么区别。 @jomo,在这种情况下,它可能是内核配置。也许这个 SO 问题/答案可以让您了解***.com/questions/410616/… 这就是我们最初认为的问题,但它无法解释为什么它不会发生在 docker 之外(实际上我们的连接比 docker 中的多) 你的回答并没有真正解决我的问题,但我宁愿把赏金给某人,而不是让它永远消失。玩得开心:) @jomo 你能在容器中和容器外发布'sysctl net'的输出吗?我很确定网络命名空间可以有不同的 sysctl 参数用于网络内容。以上是关于Docker在高负载下阻止传出连接?的主要内容,如果未能解决你的问题,请参考以下文章
502 Bad gateway nginx with PHP-FPM 在高负载下
在高并发高负载的情况下,如何给表添加字段并设置DEFAULT值?