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

时间:2017-03-27 14:21:02

标签: node.js express operating-system v8

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

通常我们fork的集群/进程数是CPU核心数,就像Nodejs offical Doc显示一样。

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`);
}

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

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

2 个答案:

答案 0 :(得分:2)

  

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

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

如果你有CPU绑定操作,那么每个核心的最佳线程/进程数总是1.对于I / O绑定操作,它不应该在大多数情况下进程不重要无论如何计算。

答案 1 :(得分:0)

考虑一种理想情况,其中您在系统中运行的所有内容都是基于节点的应用程序服务器。

这是不切实际的,因为您的机器中至少会运行5-10个进程以保持系统环境。

还假设事件循环线程(也称为应用程序线程,又称主线程)是在node.js进程中执行最有用工作的线程。

同样,这不是真的,因为在node.js进程中很少有辅助线程来保持异步事件驱动的编程模型。

再次假设通过连接客户端的眼睛测量的服务器吞吐量是每个进程如何能够利用空闲CPU的直接函数,并且作为请求 - 响应周期的一部分,该进程执行的所有操作都是纯粹是CPU绑定。

这可能是也可能不是。如果服务器与外部服务器(如DB,Web服务等)有进一步的连接,它们将在I / O通道中启动,并且线程继续执行并解决其他一些请求。但是由于所有I / O操作都是非阻塞的,并且所有潜在的阻塞操作都是异步的,因此主线程将仅相对运行CPU绑定操作,整个电路中只有一个阻塞调用 - 轮询当没有就绪I / O时阻塞的功能。

群集模块建议使用CPU数量作为群集成员计数,假设上述假设情景,并且在没有任何更好和更全面的推理的情况下,它会提供相对最佳的性能。

希望这有帮助。