2013-07-21 22 views
1

我正在寫一個基於socket.io的服務器,我試圖避免the pyramid of doom並保持內存不足。 我寫了這個客戶端 - http://jsfiddle.net/QUDXU/1/我用node client-cluster 1000運行。因此,有1000個連接正在進行連續請求。節點js避免厄運和內存同時增加金字塔

對於服務器端嘗試了3個不同的解決方案,我測試了。我讓的服務器所使用的RAM方面的結果,之後的一切運行一個小時是:

  1. 簡單的回調 - http://jsfiddle.net/DcWmJ/ - 112MB
  2. Q模塊 - http://jsfiddle.net/hhsja/1/ - 850MB和增加
  3. 異步模塊 - http://jsfiddle.net/SgemT/ - 1.2GB並增加

服務器和客戶機位於不同的機器上。 (Softlayer雲實例)。節點0.10.12和Socket.io 0.9.16

這是怎麼發生的?我如何保持低內存並使用某種允許代碼可讀的庫?

回答

0

看來問題是在客戶端腳本上,而不是在服務器上。我運行了1000個進程,每個進程每秒都會向服務器發送消息。我認爲服務器正在忙於解決所有這些請求,並因此使用所有這些內存。我改寫了客戶端一樣this,產卵數的比例,以處理器的數量,他們每個人的連接多次這樣的過程:

client = io.connect(selectedEnvironment, { 'force new connection': true, 'reconnect': false }); 

注意「強制新的連接」標誌,允許連接多個客戶端使用相同的socket.io-client實例。 解決我的問題的部分實際上是如何提出請求:任何客戶端在收到前一個請求的確認後都會發出另一個請求,而不是每秒都發出一個請求。 連接1000個客戶端使我的服務器使用〜100MB的RSS。我還在服務器腳本上使用了異步處理,看起來非常優雅,而且比Q. 更容易理解。不好的部分是,我一直在運行服務器約2-3天,內存升高到250MB RSS。這,我不知道爲什麼。

0

選項1.您可以使用羣集模塊並不時優雅地終止您的工作(請確保先斷開連接())。你可以在master中檢查process.memoryUsage()。rss> 130000000,並且當它們超過130MB時殺死它們,例如:)

選項2. NodeJS有使用內存的習慣,很少進行嚴格的清理。隨着V8達到最大內存限制,GC呼叫更具侵略性。因此,您可以通過運行node --max-stack-size <amount>來降低節點進程可能佔用的最大內存量。我在嵌入式設備上運行節點時執行此操作(通常少於64 MB的ram可用)。

選項3.如果你真的想保持內存低,使用弱引用它是可能的(除了在長時間運行調用任意位置)https://github.com/TooTallNate/node-weak。通過這種方式,對象將盡快收集垃圾。不過,需要進行大量的測試以確保一切正常。 GL如果你用這個:) https://github.com/TooTallNate/node-weak

+0

你的第一個選擇不會幫助我。我只關心服務器的內存使用情況。客戶端僅用於測試服務器。關於第二個選項,如果該進程確實需要更多內存,然後設置爲--max-stack-size,該怎麼辦? –

+0

如果進程需要更多內存,那麼讓它消耗它。當達到限制時,內存最終將被釋放。 – randunel

+0

讓我知道如何弱引用的行爲,如果你到處去測試它們。 – randunel