【问题标题】:Node.js thread pool and core usageNode.js 线程池和核心使用
【发布时间】:2017-07-28 04:52:55
【问题描述】:

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

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

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

【问题讨论】:

    标签: node.js threadpool event-loop


    【解决方案1】:

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

    磁盘 I/O 使用线程池。

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

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

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

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

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

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

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

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

    其他相关答案/文章:

    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?

    【讨论】:

    • 喜欢这个答案,它非常彻底。我想提一下,Node.js 作为一种用于任何密集图像处理的语言在我的选择列表中非常低。也许你可以用网络爬虫之类的东西代替那个例子?就个人而言,我可以看到使用多个线程进行无头浏览和循环所有线程之间的链接跟踪的好处。
    • @PatrickRoberts - 对于解析抓取结果的网络抓取,我可能只是集群,而不是工作队列。在这种情况下,您几乎可以从整个应用程序聚集到多个进程中受益,而不仅仅是其中的一个。而且,您只需在获取下一个 URL 以处理或保存结果时在集群之间进行协调。两者之间的一切都是完全独立的。
    • 哦,我错过了关于“工作队列”的部分,我也只是在考虑集群。我想在这种情况下,图像处理是 Node.js 可以利用的任务级并行化的一个很好的例子。
    • @PatrickRoberts - 仅供参考,工作进程甚至不必是 node.js 进程。它们可以是本机代码进程或 PHP 进程或任何其他类型的进程。
    • @ZeroCho - 我相信它仍然会创建多个线程。磁盘 I/O 线程的部分原因是本机代码实现使用阻塞磁盘 I/O,因此即使只有一个 CPU,您仍然可以通过多个线程获得更好的吞吐量,因为某些线程可能在任何给定时刻阻塞并且线程允许其他线程并行进行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 2013-01-17
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多