Node.js 线程池和核心使用

Node.js thread pool and core usage

我读了很多文章和Whosebug问题,我也看到了很多关于线程池的资料,但是没有人谈论物理CPU核心用法.我相信这个问题不会重复。

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

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

I'm also curious that which i/o request uses thread pool.

磁盘I/O使用线程池。

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

使用磁盘 I/O,单个磁盘 I/O 调用仍然作为非阻塞和异步呈现给 Javascript,即使它们在其本机代码实现中使用线程。当进程中的磁盘 I/O 调用超过线程池的大小时,磁盘 I/O 调用将排队,当其中一个线程空闲时,下一个磁盘 I/O 调用将进入队列将 运行 使用现在可用的线程。由于磁盘 I/O 的 Javascript 都是非阻塞的,并且假设将来某个时候会调用完成回调,因此线程池全忙时请求排队只意味着需要更长的时间获取稍后的 I/O 请求,但 Javascript 编程接口不受影响。

Given that I have a quad-core computer and libuv thread pool size of 4, will Node.js utilize all those 4 cores when processing lots of i/o requests(maybe more than thousands)?

这不符合 node.js,因此很难绝对回答。 first referenced article below 表示在 Linux 上,I/O 线程池将使用多个内核,并提供了一个小型演示应用程序来说明这一点。

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

有几个 node.js 设计模式可以保证利用多核(在任何现代 OS 中)

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

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

其他相关answers/articles:

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?