我有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叉好。
答案 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应用程序都是),那么使工作人员数量等于硬件中逻辑核心数量的经验法则仍然有意义。
如果您真的想执行繁重的阻塞计算,请为每个工作人员计算一个物理核心。