2012-02-14 18 views
3

我正在運行併發測試,並且爲了簡潔起見,爲每個欺騙性http請求定義了一個進程。它適用於多達64個請求/進程,但摺疊到65.我在I5筆記本電腦上運行Window 7(64位),帶有4GB Ram。一個node.js集羣可以在64位Wintel PC上產生多少個子進程?

在運行測試時,我打開了一個Chrome瀏覽器(帶有一些選項卡),我期望操作系統的公共系統進程也會有一些效果,但我對最低級別的node.js知之甚少了解問題所在。

例如,一篇文章表明,它是可能的一個2GB的64位Windows XP系統上運行超過8000點的過程:

http://blogs.technet.com/b/markrussinovich/archive/2009/07/08/3261309.aspx

但是,我遇到了相當顯着的64個孩子的過程圖。

任何想法?

+1

我認爲這個問題幾乎與「你可以在Windows 7(64bit)上運行多少個進程?」這對於SO來說並不是真正的主題。 – 2012-02-14 11:19:32

+1

有趣,但只是好奇,你想要做什麼? Node的模型應該是單個Node進程應該能夠處理大量的併發請求。您不需要爲每個併發請求啓動一個新進程。 – 2012-02-14 11:25:46

+0

是的,我知道。這只是一種懶惰的方式來測試一個併發條件(實質上,我有每個工作人員在啓動時發出一個http請求,並將狀態返回到命令行)。所以這個發現是偶然的。 :D @Dan D,我想我對node.js過程特別感興趣,因爲我提供的鏈接包含了關於這個主題的大量信息,但我想知道node.js工作人員是否在內存使用方面做了特定的事情/每個進程的分配。正如羅漢所說,這是我無論如何可以解決的一個問題。 – Charlie 2012-02-14 11:38:13

回答

11

好的節點是異步的,沒有阻塞,只能由當前腳本完成,它可以完美地處理多個連接,所以這意味着對於高併發性,它會使用所有的CPU,但每個進程只能使用一個內核,因爲Node不是線程的。所以從技術上講,推薦擁有與核心一樣多的進程,每個進程都有一個核心。在這種情況下,高度併發的節點集羣將使用所有的CPU。如果你不止這些,你就會浪費你的內存,並在你的操作系統調度程序中增加額外的工作。除此之外,每個nodejs進程都有啓動時間。所以在運行時創建一個nodejs進程是非常昂貴的。

從Node.js的文檔:

這些子節點仍是V8的全新的實例。假設至少有 爲每個新節點啓動30毫秒和10MB內存。也就是說,你不能創建數千個這樣的數字。

結論做的最好的事情是到餐桌,就像你的CPU內核的數量,這就是:

var cluster = require('cluster'); 
var http = require('http'); 
var numCPUs = require('os').cpus().length; 

if (cluster.isMaster) { 
    // Fork workers. 
    for (var i = 0; i < numCPUs; i++) { 
    cluster.fork(); 
    } 

    cluster.on('death', function(worker) { 
    console.log('worker ' + worker.pid + ' died'); 
    cluster.fork(); 
    }); 
} else { 
    // Worker processes have a http server. 
    http.Server(function(req, res) { 
    res.writeHead(200); 
    res.end("hello world\n"); 
    }).listen(8000); 
} 

實際上,我們有一個生產服務器,這樣做,可拍攝約1000併發,並且服務Hello世界的延遲小於10ms。

+1

100毫秒延遲服務'你好世界'?我帶你回顧一下。我從我的dev-machine開始在2ms內爲Redis提供一些緩存 – 2012-03-02 19:57:09

+0

嗯,我在我的筆記本電腦上得到它少於10ms ...服務器性能有點低( – 2012-03-05 01:44:54

+0

)如果我在同一臺服務器上有兩個應用程序,這些應用程序是集羣? 想象一下,我有一個4核心cpu。我應該爲每個應用程序設置2個內核還是僅使用每個應用程序中的最大內核? – 2016-12-09 14:47:48

相關問題