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

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

function#0:1698.801ms

function#1:3282.679ms

function#4:3290.384ms

function#3:3425.090ms

function#2:3424.922ms

用3个叉子,我得到了:

function#0:1695.155ms

function#2:1822.867ms

function#3:2444.156ms

function#1:2606.680ms

用2个叉子,我得到了:

函数#0:1684.929ms

function#1:1682.897ms

function#2:1686.123ms

我不明白这些结果。 不是1叉/芯 最佳数量? 在这里,我看到4叉不比2叉更好。

我的猜测是你的硬件实际上只有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绑定(大多数节点应用程序),那么将工人数量等同于硬件中逻辑内核数量的经验法则仍然有意义。

如果你真的想要执行沉重的,阻塞的计算,每个工作者计算一个物理核心。