Docker在高负载时阻塞传出连接?

时间:2015-07-14 22:09:20

标签: sockets http tcp docker dokku

我们有一个node.js网络服务器,可以向外部API发出一些传出的http请求。它使用dokku在docker中运行 经过一段时间的加载(30req / s)后,这些传出请求不再得到响应。

这是我在使用常量req / s进行测试时所做的图表: graph incomingoutgoing是并发请求的数量(不是初始化请求的数量)。 (在图表中很难看到,但每次约10次请求时它相当稳定。)
response time仅适用于外部请求。 您可以清楚地看到他们突然突然失败(达到我们的1000毫秒超时)。

我们发送的req / s越多,我们遇到这个问题的速度就越快,所以我们必须有一些限制,我们越来越接近每个请求。

我在主机上使用netstat -ant | tail -n +3 | wc -l来获取打开的连接数,但它只有~450(其中大多数是TIME_WAIT)。这不应该达到套接字限制。我们也没有达到任何RAM或CPU限制。

我也尝试在docker之外的同一台机器上运行相同的应用程序,只在docker 中运行。

1 个答案:

答案 0 :(得分:3)

这可能是由于Docker userland代理。如果您运行的是最新版本的Docker,请尝试使用--userland-proxy=false选项运行该守护程序。这将使Docker仅使用iptables处理端口转发,并且开销更少。