簡體   English   中英

Node.js集群 - 最佳工作人員數量

[英]Node.js cluster - optimal number of workers

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

功能#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叉好。

我的猜測是你的硬件實際上只有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應用程序都是),那么使工作人員數量等於硬件中邏輯核心數量的經驗法則仍然有意義。

如果您真的想要執行繁重的阻塞計算,請為每個工作人員計算一個物理核心。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM