2014-04-18 46 views
1

考慮一個簡單的express應用:如何處理的Node.js未閉合的HTTP響應

app.get '/hang', (req, res) -> 
    console.log 'Request ', n 
    n += 1 
    # res.send 200 

哎呦,我不小心把註釋掉res.send,哦,讓我們看看會發生什麼!

如果我打/hang與我的瀏覽器,它只是坐在那裏旋轉,這是有道理的。沒有send我們沒有關閉連接(正確的假設?)。讓我們來看看,如果我們打/hanga bunch of simultaneous connections會發生什麼:

$ 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. 是我的服務器現在用水管沖洗,直到它重新啓動?

附加:

你可以通過-rab把它忽略套接字錯誤。 當我使用,我開始看到ab列出一些要求爲已經完成:

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

難道這是連接被關閉的Node.js?

回答

2

這裏發生了什麼?

的連接只是坐視不管什麼也不做。他們花費內存來保持開放,但CPU可以忽略不計。

將這些連接最終被關閉?

是的,我相信OS的網絡層將最終關閉他們的超時錯誤。客戶端或服務器可能會根據配置(特別是保持活動和超時值)觸發此操作。

是我的服務器現在用水管沖洗,直到它重新啓動?

不,您可以乾淨地從一定數量的這些中恢復而無需重新啓動。因此,如果在真正的服務器中,一個錯誤導致每1000個請求中有1個掛起而沒有響應,對於給定的流量負載,這是一個可管理的問題。它基本上是每單位流量和流量負載的掛起連接的功能,以確定這是一個可生存的錯誤還是級聯失控,直到服務器耗盡資源。