2013-02-23 50 views
1

我一直在試圖弄清楚這一點。我在節點中編寫了一個非常簡單的http服務器來衡量使用集羣的效果。這裏是我的代碼:使用羣集的Node.js性能

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

if(process.argv.length >= 3) 
{ 
    numCPUs = process.argv[2]; 
} 

if (cluster.isMaster && numCPUs > 0) { 
    console.log("launching " + numCPUs + " procs"); 
    // Fork workers. 
    for (var i = 0; i < numCPUs; i++) { 
    console.log("launching proC#" + i); 
    cluster.fork(); 
    } 

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

問題是,我沒有看到任何性能增益。 1過程大部分時間都有更好的表現。而且,如果我添加更多的工作,比如從redis或mongo中檢索數據,那麼增加這些流程會有所幫助,但只是適度地(大約15%)。我已經在一個i7 MBPr(帶有HT的四核)和一個i5(四核)Win7系統上嘗試過這兩種方法,結果相同。

有人能解釋這個代碼有什麼問題嗎?或者,爲什麼我在使用集羣時看不到優勢/好處?

回答

1

您的測試似乎幾乎完全是面向I/O的,在這種情況下,使用cluster幾乎沒有什麼好處(正如您所見),因爲I/O無論如何都是併發的。

要看到顯着的好處,您需要有部分CPU限制的代碼,因爲只有這樣才能在羣集工作人員之間提供額外的並行性。

+1

這確實有道理,但這是否意味着很少有哪些情況下集羣可以使用? – George 2013-02-25 21:24:27

+0

@George不,我不會那麼說。大多數真實的應用程序都有足夠的CPU使用量,這不是一個像你一樣使用的簡單例子。 – JohnnyHK 2013-02-25 21:37:34