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

zbe*_*ens 3 javascript multithreading node.js node-cluster

我有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();
    }
}
Run Code Online (Sandbox Code Playgroud)

有了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叉好.

rob*_*lep 6

我的猜测是你的硬件实际上只有2个物理核心.但是,由于超线程(HT),操作系统会说存在4个(逻辑)核心.

代码中的工作者将(物理)内核完全占用,这是HT无法很好地处理的事情,因此保持所有4个逻辑内核忙的性能将比仅保持2个物理内核忙时的性能更差.

我的硬件(四核,4个物理核和8个逻辑核)显示相同的模式:

也就是说,如果您的工作者受I/O限制(大多数Node应用程序都是),那么使工作人员数量等于硬件中逻辑核心数量的经验法则仍然有意义.

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