好的節點是異步的,沒有阻塞,只能由當前腳本完成,它可以完美地處理多個連接,所以這意味着對於高併發性,它會使用所有的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。
我認爲這個問題幾乎與「你可以在Windows 7(64bit)上運行多少個進程?」這對於SO來說並不是真正的主題。 – 2012-02-14 11:19:32
有趣,但只是好奇,你想要做什麼? Node的模型應該是單個Node進程應該能夠處理大量的併發請求。您不需要爲每個併發請求啓動一個新進程。 – 2012-02-14 11:25:46
是的,我知道。這只是一種懶惰的方式來測試一個併發條件(實質上,我有每個工作人員在啓動時發出一個http請求,並將狀態返回到命令行)。所以這個發現是偶然的。 :D @Dan D,我想我對node.js過程特別感興趣,因爲我提供的鏈接包含了關於這個主題的大量信息,但我想知道node.js工作人員是否在內存使用方面做了特定的事情/每個進程的分配。正如羅漢所說,這是我無論如何可以解決的一個問題。 – Charlie 2012-02-14 11:38:13