【问题标题】:How does Node.js handle unclosed HTTP responsesNode.js 如何处理未关闭的 HTTP 响应
【发布时间】:2014-04-19 01:47:11
【问题描述】:

考虑一个微不足道的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 ns,然后就卡住了。

我的问题是:

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

补充:

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

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

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

【问题讨论】:

    标签: node.js http express


    【解决方案1】:

    这里发生了什么?

    连接只是无所事事。它们确实需要内存来保持打开状态,但 CPU 可以忽略不计。

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

    是的,我相信操作系统的网络层最终会以超时错误关闭它们。客户端或服务器都可以根据配置(尤其是keepalives和超时值)触发此操作。

    我的服务器在重新启动之前是否一直处于水管状态?

    不,您可以从一定数量的这些中完全恢复而无需重新启动。因此,如果在真实服务器中,一个错误导致每 1000 个请求中有 1 个在没有响应的情况下挂起,对于给定的流量负载,它是可以管理的。它基本上是每单位流量和流量负载的挂起连接的函数,以确定这是一个可生存的错误还是会级联失控,直到您的服务器耗尽资源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-03
      • 1970-01-01
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 2016-02-29
      • 1970-01-01
      • 2010-09-12
      相关资源
      最近更新 更多