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绑定(大多数节点应用程序),那么将工人数量等同于硬件中逻辑内核数量的经验法则仍然有意义。
如果你真的想要执行沉重的,阻塞的计算,每个工作者计算一个物理核心。