Zer*_*Cho 2 event-loop threadpool node.js
我阅读了大量文章和stackoverflow问题,也看到了很多关于线程池的信息,但没有人谈论物理CPU内核使用情况。我相信这个问题没有重复。
鉴于我有一台四核计算机和大小为 4 的 libuv 线程池,Node.js 在处理大量 i/o 请求(可能超过数千个)时是否会利用所有这 4 个内核?
我也很好奇哪个i/o 请求使用thread pool。没有人给出清晰完整的请求清单。我知道 Node.js 事件循环是单线程的,但使用线程池来处理 I/O,例如访问磁盘和数据库。
我也很好奇哪个 i/o 请求使用线程池。
磁盘 I/O 使用线程池。
网络 I/O 从一开始就是异步的,并且不使用线程。
使用磁盘 I/O,单个磁盘 I/O 调用仍然以非阻塞和异步的形式呈现给 Javascript,即使它们在其本机代码实现中使用线程。当进程中的磁盘 I/O 调用超过线程池的大小时,磁盘 I/O 调用将排队,当其中一个线程释放时,队列中的下一个磁盘 I/O 调用将使用该调用运行现在可用线程。由于磁盘 I/O 的 Javascript 都是非阻塞的,并且假设将来某个时间会调用完成回调,因此当线程池都忙时请求的排队意味着需要更长的时间才能到达后面的我/O 请求,但不影响 Javascript 编程接口。
鉴于我有一台四核计算机和大小为 4 的 libuv 线程池,Node.js 在处理大量 i/o 请求(可能超过数千个)时是否会利用所有这 4 个内核?
这不是由 node.js 决定的,因此很难绝对回答。下面引用的第一篇文章说,在 Linux 上,I/O 线程池将使用多个内核,并提供了一个小型演示应用程序来说明这一点。
这取决于特定的操作系统实现和它使用的线程调度程序。node.js 只是愉快地创建线程并使用它们,然后操作系统决定如何使用 CPU,因为它被要求在系统上执行整体操作。由于同一进程中的线程通常必须以某种方式相互通信,因此为同一进程中的不同线程使用单独的 CPU 要复杂得多。
有几个 node.js 设计模式可以保证利用多核(在任何现代操作系统中)
对您的应用程序进行集群并创建与处理器内核数量相同的集群。这还有一个好处,就是每个集群都有自己的 I/O 线程池,可以独立工作,每个集群都可以独立执行自己的 Javascript。只有一个 node.js 进程和多个内核,你永远不会得到一个以上的 Javascript 执行线程(这就是 node.js 被称为单线程的地方——即使它在其库实现中确实使用了线程)。但是,通过集群,您可以为每个集群服务器进程独立执行 Javascript。
对于可能占用大量 CPU 资源的单个任务(例如,图像处理),您可以创建一个工作队列和一个将工作交给的子工作进程池。这与集群有一些共同的好处,但它是更特殊的用途,您可以确切地知道 CPU 瓶颈在哪里,并且您想专门攻击它。
其他相关答案/文章:
| 归档时间: |
|
| 查看次数: |
1658 次 |
| 最近记录: |