3

私は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 つのフォーク (上記のコード) を使用すると、次のようになりました。

関数 #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 フォークより優れていないことがわかります。

4

1 に答える 1

7

私の推測では、ハードウェアには実際には 2 つの物理コアしかありません。ただし、ハイパースレッディング(HT) のため、OS は 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 アプリ) である場合でも意味があります。

負荷の高いブロッキング計算を本当に実行したい場合は、ワーカーごとに 1 つの物理コアを数えます。

于 2016-09-15T14:03:33.497 に答える