考虑一个微不足道的应用程序:
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 n
s,然后就卡住了。我的问题是:
这里发生了什么事?
这些连接最终会关闭吗?或:
我的服务器在重新启动之前是否已被托管?
附加:
您可以将
-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个在没有响应的情况下挂起,那么对于给定的流量负载,它是可以管理的。它基本上是每单位流量和流量负载的挂起连接的函数,用于确定这是一个可生存的错误,还是在服务器耗尽资源之前级联失控。