为了利用 Node.js 中的多处理器优势,为什么我们 fork 的集群数量是 CPU 核数?

jun*_*nxi 7 operating-system v8 node.js express

我知道这可能是个愚蠢的问题。我不擅长操作系统知识。

通常我们 fork 的集群/进程的数量是 CPU 核心数,就像Nodejs 官方文档显示一样。

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  console.log(`Master ${process.pid} is running`);

  // Fork workers.
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`worker ${worker.process.pid} died`);
  });
} else {
  // Workers can share any TCP connection
  // In this case it is an HTTP server
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('hello world\n');
  }).listen(8000);

  console.log(`Worker ${process.pid} started`);
}
Run Code Online (Sandbox Code Playgroud)

但是我很困惑,如果我们分叉集群的数量超过 CPU 内核的数量,会发生什么?

是经验值、最佳实践还是任何其他原因?

rsp*_*rsp 3

但我很困惑,如果我们分叉集群的数量超过 CPU 核心的数量,会发生什么?

什么都不会发生,一切仍然会工作,但是每个核心放置多个 CPU 密集型线程或进程不会使应用程序变得更快 - 如果有的话,它可能只会变得更慢,因为核心会浪费一部分时间上下文在线程之间切换。

如果您有 CPU 密集型操作,则每个核心的最佳线程/进程数始终为 1。对于 I/O 密集型操作,这并不重要,因为大多数时候进程不会执行任何计算。