考虑一个微不足道的应用程序:

app.get '/hang', (req, res) ->
  console.log 'Request ', n
  n += 1
  # res.send 200

哎哟,我不小心评论出了express,哦,好吧,让我们看看会发生什么!
如果我用浏览器点击res.send,它就会在那里旋转,这是有意义的。如果没有/hang我们就不会关闭连接(正确的假设?)。让我们看看如果用send点击/hang会发生什么:
$ ab -n 1000 -c 1000 http://localhost:3000/hang

Benchmarking localhost (be patient)
apr_socket_recv: Connection reset by peer (104)

这个应用程序设法打印出几百个Request ns,然后就卡住了。
我的问题是:
这里发生了什么事?
这些连接最终会关闭吗?或:
我的服务器在重新启动之前是否已被托管?
附加:
您可以将-r传递到ab以使其忽略套接字错误。
当我使用它时,我开始看到ab列出一些正在完成的请求:
Completed 100 requests
Completed 200 requests
apr_pollset_poll: The timeout specified has expired (70007)

这可能是node.js正在关闭的连接吗?

最佳答案

这里发生了什么事?
这些关系只是无所事事。它们确实会消耗内存来保持打开状态,但CPU却可以忽略不计。
这些连接最终会关闭吗?
是的,我相信操作系统的网络层最终会以超时错误关闭它们。客户端或服务器可以根据配置触发此操作(尤其是keepalives和超时值)。
我的服务器在重新启动之前是否已被托管?
不,您可以在不重新启动的情况下从一定数量的这些文件中完全恢复。因此,如果在一个真正的服务器中,一个bug导致每1000个请求中就有1个在没有响应的情况下挂起,那么对于给定的流量负载,它是可以管理的。它基本上是每单位流量和流量负载的挂起连接的函数,用于确定这是一个可生存的错误,还是在服务器耗尽资源之前级联失控。

09-19 04:51