考虑一个简单的express应用:
app.get '/hang', (req, res) ->
console.log 'Request ', n
n += 1
# res.send 200
糟糕,我不小心评论了res.send
,哦,好吧,让我们看看会发生什么!
如果我用我的浏览器点击/hang
它只是坐在那里旋转,这是有道理的。没有send
我们没有关闭连接(正确的假设?)。让我们看看如果我们使用a bunch of simultaneous connections点击/hang
会发生什么:
$ ab -n 1000 -c 1000 http://localhost:3000/hang
Benchmarking localhost (be patient)
apr_socket_recv: Connection reset by peer (104)
该应用程序设法打印出几百Request n
秒,然后才卡住。
我的问题是:
其他:
您可以将-r
传递给ab
,让它忽略套接字错误。
当我使用它时,我开始看到ab
列出了一些请求已完成:
Completed 100 requests
Completed 200 requests
apr_pollset_poll: The timeout specified has expired (70007)
这可能是node.js关闭的连接吗?
答案 0 :(得分:2)
这里发生了什么?
这些联系只是无所事事。它们会花费内存来保持开放,但CPU却可以忽略不计。
这些连接最终会被关闭吗?
是的,我相信操作系统的网络层最终会因超时错误而关闭它们。客户端或服务器可能会触发此操作,具体取决于配置(特别是Keepalive和超时值)。
我的服务器现在是否已经重新启动?
不,您可以在不重启的情况下从一定数量的内容中彻底恢复。因此,如果在真实服务器中,一个错误导致每1000个请求中有1个挂起而没有响应,对于给定的流量负载,它将是可管理的。它基本上是每单位流量和流量负载的挂起连接的功能,以确定这是一个可生存的错误,还是在服务器耗尽资源之前级联失控。