node.js のクラスター モードのすべての例が、CPU の数と同じプロセスの数にフォークするのはなぜですか?
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', function(worker, code, signal) {
console.log('worker ' + worker.process.pid + ' died');
});
} else {
// worker process
// do the job....
}
より多くのプロセスにフォークすることは可能ですか? core-4 の 10 プロセスでこのコードを試してみましたが、動作しているようです。しかし、それは良い考えでしょうか?
ベストアンサー1
フォークの数が CPU コアの数と等しい理由は、それが最適な数だからです。それを超えてフォークの数を増やすと、パフォーマンスが低下する可能性があります。これは、プロセッサに N 個のコアがある場合、同時に処理できるプロセスは N 個だけであるためです。
たとえば、4つのコアがあり、10のプロセスがあり、各プロセスに少なくとも1つのスレッドがある場合、CPUで同時に実行できるのは4つのスレッドだけです。残りのスレッドは、プロセッサによって実行される順番を待つことになります。その後、OSは断続的に次の処理を実行します。コンテキストスイッチ、実行中のスレッドを一時停止し、待機中のスレッドに切り替えて、代わりにそのスレッドを実行します。この「切り替え」プロセスにより、追加の処理オーバーヘッドが発生します。したがって、CPU サイクルを最も効率的に使用するには、コンテキストの切り替えを最小限に抑えるために、フォーク (プロセス) の数をコアの数と一致させる必要があります。