为什么每个内核运行一个Node.js进程?

时间:2019-02-24 06:32:19

标签: node.js multithreading asynchronous event-loop

根据https://nodejs.org/api/cluster.html#cluster_cluster,应该并行运行与计算机上内核数相同数量的Node.js进程。 可能的原因是Node.js是单线程的。

但是,这是真的吗?确保JavaScript代码和事件循环在一个线程上运行,但是Node也有一个工作线程池。该池中的默认线程数为4。那么为什么每个内核运行一个Node进程有意义?

2 个答案:

答案 0 :(得分:1)

This article对node.js的线程机制进行了扩展审查,值得一读。

简而言之,要点是在纯node.js中,只有少数函数调用使用线程池(DNS和FS调用)。您的呼叫大多在 only 事件循环上运行。因此,例如,如果您编写了一个Web应用程序,每个请求同步花费100毫秒,那么您的绑定速度将为10req / s。不会涉及线程池。要提高多核系统的吞吐量,就要使用其他内核。

然后是异步或回调函数。虽然它确实给您带来了并行化的感觉,但实际上发生的是它等待异步代码在后台完成,以便事件循环可以在另一个函数调用上运行。之后,回调代码仍然必须在事件循环中运行,因此您所有编写的代码仍然只能在一个事件循环中运行,因此将无法利用多核系统的功能。

答案 1 :(得分:0)

所说的document明确指出Node是单线程的:

  

Node.js的单个实例在单个线程中运行。为了利用多核系统,用户有时会希望启动Node.js进程集群来处理负载。

这样,除非使用child_processcluster,使用libuv的本机附加组件或several built-in modules的相应API创建新线程,否则Node进程只有一个线程踏步:

  

Node.js尽可能使用异步系统API,但在不存在异步系统API的情况下,libuv的线程池用于基于同步系统API创建异步节点API。使用线程池的Node.js API是:

     

所有fs API,但文件监视程序API和   显式同步

     

crypto.pbkdf2()

     

crypto.randomBytes(),除非在没有回调的情况下使用

     

crypto.randomFill()

     

dns.lookup()

     

所有zlib API(显式同步的API除外)

单个线程使用1个CPU内核,为了最大程度地利用可用资源并利用多核CPU,应有多个线程,以内核数作为经验法则。

如果集群进程占用了100%的CPU,并且已知还有其他线程或外部进程(数据库服务)会与集群进程争夺CPU核心,则可以减少集群进程的数量。