为什么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个进程的代码,它似乎正在工作。但是 - 这是一个好主意吗?
答案 0 :(得分:22)
分叉数等于CPU核心数的原因是因为这是最佳数量。增加它可以降低性能,原因是因为如果你的处理器有N个核心,它只能同时处理N个进程。
例如:如果你有4个内核,并且你有10个进程,每个进程至少有1个线程,那么你的CPU只能同时执行其中4个线程。其余的线程将等待轮到他们执行处理器。然后,您的操作系统将间歇性地执行上下文切换,从而暂停正在运行的线程,并切换到正在等待的线程,然后执行该线程。这种“切换”过程导致额外的处理开销。因此,为了最有效地使用CPU周期,您希望叉(进程)的数量与核心数相匹配,以最大限度地减少上下文切换。