Node.js thread pool and core usage
我已经阅读了大量的文章和关于stackoverflow的问题,并且看到了很多有关线程池的信息,但是没有人谈论物理CPU内核的使用。 我相信这个问题不会重复。
假设我有一台四核计算机,并且libuv线程池大小为4,那么在处理大量I / O请求(可能超过数千个)时,Node.js会利用所有这四个内核吗?
我也很好奇哪个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决定的,因此很难绝对回答。下面的第一篇引用文章指出,在Linux上,I / O线程池将使用多个内核,并提供一个小型演示应用程序来显示这一点。
这取决于特定的OS实施及其使用的线程调度程序。 node.js只是很高兴地创建线程并使用它们,然后操作系统根据给定的总体要求决定如何利用CPU。由于同一进程中的线程通常必须以某种方式相互通信,因此对于同一进程中的不同线程使用单独的CPU要复杂得多。
有两种保证可以充分利用多个内核的node.js设计模式(在任何现代操作系统中)
对您的应用程序进行群集,并创建与具有处理器核心一样多的群集。这还有一个优势,每个集群都有自己的I / O线程池,这些线程池可以独立工作,并且每个都可以独立执行自己的Javascript。仅具有一个node.js进程和多个内核,就永远不会获得一个以上的Javascript执行线程(这就是node.js被称为单线程的地方-尽管它确实在其库实现中使用了线程)。但是,有了集群,您就可以为每个集群服务器进程独立执行Javascript。
对于可能占用大量CPU的单个任务(例如,图像处理),您可以创建工作队列以及将其移交给的子工作进程的池。这与群集有一些共同的好处,但是在您更确切地知道CPU瓶颈在哪里并且您想专门针对它进行攻击时,这是更特殊的用途。
其他相关答案/文章:
nodejs中的libuv线程如何利用多核cpu
多核计算机上的Node.js
在node.js中利用多处理器环境
什么时候使用线程池?