【发布时间】: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 重试超时范围内。太短了。
标签: sockets http tcp docker dokku