Node.js集群 - 最佳工作人员数量

时间:2016-09-15 12:49:54

标签: javascript node.js multithreading node-cluster

我有4个核心并根据this example运行此代码:

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 fork(上面的代码),我得到了:

  

功能#0:1698.801ms

     

功能#1:3282.679ms

     

功能#4:3290.384ms

     

功能#3:3425.090ms

     

功能#2:3424.922ms

用3叉,我得到了:

  

功能#0:1695.155ms

     

功能#2:1822.867ms

     

功能#3:2444.156ms

     

功能#1:2606.680ms

用2叉,我得到了:

  

功能#0:1684.929ms

     

功能#1:1682.897ms

     

功能#2:1686.123ms

我不明白这些结果。不是 1分叉/核心 最佳号码?在这里,我看到4叉并不比2叉好。

1 个答案:

答案 0 :(得分:6)

我的猜测是你的硬件实际上只有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限制(大多数Node应用程序都是),那么使工作人员数量等于硬件中逻辑核心数量的经验法则仍然有意义。

如果您真的想执行繁重的阻塞计算,请为每个工作人员计算一个物理核心。