Node.js线程池和核心用法

时间:2017-07-28 04:52:56

标签: node.js threadpool event-loop

我已阅读大量文章和stackoverflow问题,我看到了很多关于线程池的信息,但没有人谈到物理CPU核心的使用情况。我相信这个问题不会重复。

鉴于我的四核计算机和libuv线程池大小为4,Node.js在处理大量i / o请求(可能超过数千个)时会利用所有这4个核心吗?

我也很好奇 i / o请求使用线程池。没有人给出明确和完整的请求清单。我知道Node.js事件循环是单线程的,但使用线程池来处理i / o,例如访问磁盘和db。

1 个答案:

答案 0 :(得分:4)

  

我也很好奇哪个i / o请求使用了线程池。

磁盘I / O使用线程池。

网络I / O从一开始就是异步,不使用线程。

对于磁盘I / O,即使在本机代码实现中使用线程,单个磁盘I / O调用仍然作为非阻塞和异步呈现给Javascript。当进程中的磁盘I / O调用超过线程池大小时,磁盘I / O调用将排队,当其中一个线程释放时,队列中的下一个磁盘I / O调用将使用该调用运行现在可用的线程。由于磁盘I / O的Javascript都是非阻塞的并且假设完成回调将在未来的某个时间被调用,所以当线程池全部忙时请求的排队只意味着它需要更长的时间才能到达后来的I / O请求,但Javascript编程接口不受影响。

  

鉴于我的四核计算机和libuv线程池大小为4,Node.js在处理大量i / o请求(可能超过数千个)时会利用所有这4个核心吗?

这不是由node.js决定的,因此绝对难以回答。 first referenced article below表示在Linux上,I / O线程池将使用多个内核,并提供一个显示该内核的小型演示应用程序。

这取决于特定的OS实现和它使用的线程调度程序。 node.js只是愉快地创建线程并使用它们,然后操作系统决定如何利用CPU给出在系统上要求整体执行的操作。由于同一进程中的线程通常必须以某种方式相互通信,因此在同一进程中为不同的线程使用单独的CPU会复杂得多。

有一些node.js设计模式可以保证利用多个核心(在任何现代操作系统中)

  1. 群集您的应用并创建与处理器核心一样多的群集。这也具有以下优点:每个集群都有自己的I / O线程池,可以独立工作,每个集群都可以独立执行它自己的Javascript。只有一个node.js进程和多个核心,你永远不会获得多个Javascript执行线程(这就是node.js被称为单线程的地方 - 尽管它在其库实现中确实使用了线程)。但是,通过群集,您可以为每个群集服务器进程执行独立的Javascript执行。

  2. 对于可能是CPU密集型的单个任务(例如,图像处理),您可以创建工作队列和您工作的子工作进程池。这与集群有一些共同的好处,但它更特殊的目的是你确切地知道CPU瓶颈在哪里并且你想要专门攻击它。

  3. 其他相关答案/文章:

    how libuv threads in nodejs utilize multi core cpu

    Node.js on multi-core machines

    Taking Advantage of Multi-Processor Environments in node.js

    When is the thread pool used?