考虑一个简单的快递应用程序:
app.get '/hang', (req, res) ->
console.log 'Request ', n
n += 1
# res.send 200
糟糕,我不小心将注释掉了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
秒,然后卡住了。
我的问题是:
额外的:
你可以通过-r
向ab
有它忽略套接字错误。当我使用它时,我开始看到ab
列出一些已完成的请求:
Completed 100 requests
Completed 200 requests
apr_pollset_poll: The timeout specified has expired (70007)
难道这是由node.js关闭的连接?
这里发生了什么事?
连接只是闲着无所事事。它们确实需要消耗内存来保持开放,但CPU可以忽略不计。
这些连接最终会关闭吗?
是的,我相信操作系统的网络层最终会因超时错误而将其关闭。客户端或服务器都可以根据配置(特别是Keepalives和超时值)触发此操作。
在重新启动之前,我的服务器现在是否处于连接状态?
不,您可以从一定数量的设备中完全恢复,而无需重新启动。因此,如果在真实服务器中,如果某个错误导致每1000个请求中有1个被挂起而没有响应,则对于给定的流量负载而言,它将是可管理的。基本上,这是每单位流量和流量负载的挂起连接的功能,以确定这是可幸免的错误,还是会逐渐失去控制,直到服务器耗尽资源。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句