3

我有 4 个内核并根据此示例运行此代码:

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

用 3 个叉子,我得到:

功能#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不是最佳数字吗?在这里,我看到 4 叉并不比 2 叉好。

4

1 回答 1

7

我的猜测是您的硬件实际上只有 2 个物理内核。但是,由于超线程(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 应用程序都是),那么使工作人员数量等于硬件中逻辑内核数量的经验法则仍然有意义。

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

于 2016-09-15T14:03:33.497 回答