Node.js如何处理未关闭的HTTP响应

时间:2014-04-18 17:31:11

标签: node.js http express

考虑一个简单的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秒,然后才卡住。

我的问题是:

  1. 这里发生了什么事?
  2. 这些连接最终会被关闭吗?或者:
  3. 我的服务器现在是否已经重新启动?

  4. 其他:

    您可以将-r传递给ab,让它忽略套接字错误。 当我使用它时,我开始看到ab列出了一些请求已完成:

    Completed 100 requests
    Completed 200 requests
    apr_pollset_poll: The timeout specified has expired (70007)
    

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

1 个答案:

答案 0 :(得分:2)

  

这里发生了什么?

这些联系只是无所事事。它们会花费内存来保持开放,但CPU却可以忽略不计。

  

这些连接最终会被关闭吗?

是的,我相信操作系统的网络层最终会因超时错误而关闭它们。客户端或服务器可能会触发此操作,具体取决于配置(特别是Keepalive和超时值)。

  

我的服务器现在是否已经重新启动?

不,您可以在不重启的情况下从一定数量的内容中彻底恢复。因此,如果在真实服务器中,一个错误导致每1000个请求中有1个挂起而没有响应,对于给定的流量负载,它将是可管理的。它基本上是每单位流量和流量负载的挂起连接的功能,以确定这是一个可生存的错误,还是在服务器耗尽资源之前级联失控。