2016-09-15 38 views
1

的最佳數目我有4個核心和運行該代碼根據this exampleNode.js的簇 - 工人

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

var id = 0; 
if (cluster.isWorker) { 
    id = cluster.worker.id; 
} 

var iterations = 1000000000; 
console.time('Function #' + id); 
for (var i = 0; i < iterations; i++) { 
    var test = 0; 
} 
console.timeEnd('Function #' + id); 

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

具有4叉(上面的代碼),我得到:

功能#0:1698.801ms

功能#1:3282.679ms

功能#4:3290.384ms

功能#3:3425.090ms

功能#2:3424.922ms

具有三叉,我得到:

功能#0:1695.155ms

功能# 2:1822.867ms

功能#3:2444.156ms

功能#1:2606.680ms

設有2叉,我得到:

功能#0:1684.929ms

功能#1:1682.897ms

功能#2 :1686.123ms

我不明白這些結果。是不是1 fork/core最佳 number?在這裏,我看到4叉不比2叉更好。

回答

4

我的猜測是,你的硬件卻只有2個物理內核。但是,由於hyper-threading(HT),操作系統會說有4個(邏輯)核心存在。

代碼中的工作人員保持完全佔用的(物理)內核,這是HT無法很好處理的問題,因此保持所有4個邏輯內核忙碌時的性能將比僅保留2個物理內核忙碌。

我的硬件(四核,所以4個物理和8個邏輯核心)示出了相同的模式:

  • 8工人:

    Function #5: 926ms 
    Function #3: 916ms 
    Function #1: 928ms 
    Function #4: 895ms 
    Function #7: 934ms 
    Function #6: 905ms 
    Function #8: 928ms 
    Function #2: 928ms 
    
  • 4名工人:

    Function #3: 467ms 
    Function #2: 467ms 
    Function #1: 473ms 
    Function #4: 472ms 
    

這就是說,經驗法則如果您的工作人員是I/O綁定的(大多數節點應用程序都是這樣),那麼使得您的硬件中等於邏輯內核數量的工作者數量仍然有意義。

如果你真的想要執行繁重的阻塞計算,請爲每個工作者計算一個物理核心。

+0

感謝您的信息。那麼對於Node.js,另一半內核僅用於異步代碼?它是否需要集羣或者它是否意味着Node.js只使用一個執行線程,而另一些**也可以並行使用異步代碼的線程(〜核心?)?另外,由於我正在開發一款遊戲,它主要是受CPU限制的。但是我在github工作中看到了一些'setTimeout(updateClients,0);',因爲「異步更新提高了性能」。他們是對的嗎? – zbeyens

+1

節點本身不安排任何事情,這取決於操作系統(以及CPU本身)。如果你有CPU綁定的代碼,'cluster'可以幫助你,因爲它可以讓你在單獨的進程中運行CPU繁忙的代碼,操作系統可以安排到不同的代碼作爲應用程序的「主要」部分。如果您在同一個進程中將I/O綁定和CPU綁定內核混合在一起,那麼使用'setTimeout()'技巧非常有用。 – robertklep