【问题标题】:How do node.js and libuv use the different threads?node.js 和 libuv 如何使用不同的线程?
【发布时间】:2015-12-03 11:29:40
【问题描述】:

在对 Node.js 和 libuv 进行一些研究时,我使用 UV_THREADPOOL_SIZE=1 启动了一个简单的节点服务器,并查看了 pstree 以了解它真正使用了多少线程。

对于 Node.js 0.10 pstree -p | grep node 产生

node(5157)-+-{node}(5158) `-{node}(5162)

为了让事情更复杂一点,我也尝试了 0.12 和 iojs 3.3。每个版本的线程数都不同。

线程总数与线程池大小

0.10:UV_THREADPOOL_SIZE + 1

0.12:UV_THREADPOOL_SIZE + 2

3.3:UV_THREADPOOL_SIZE + 4

我还尝试为线程池大小设置更高的数字,以确保我不低于某个最小值。

我的问题是:

  1. 在主进程 (5157) 上执行什么,在下面的线程上执行什么?
  2. 我们可以假设 (5158) 是 libuv 的线程 ID,并且 (5162) 是单个“工作”线程吗?
  3. 在 0.12 和 iojs 3.3 中会发生什么?为什么多出 4 个线程?

【问题讨论】:

    标签: node.js libuv iojs


    【解决方案1】:

    我真的不能说 Node/V8 部分,但总的来说 amy libuv 应用程序将使用至少 1 + UV_THREADPOOL_SIZE 线程。

    第一个线程是通过调用 uv_run 来运行 libuv 循环的线程,通常是主线程。然后 libuv 有一个 UV_THREADPOLL_SIZE 大小的线程池,运行文件系统和 DNS 操作。网络 i/o 在循环线程中使用 epoll/kqueue 等进行。

    【讨论】:

    • 我现在也问过 Node.js 的布道工作组。这是完整的答案:github.com/nodejs/evangelism/issues/149 TL/DR:Node.js 更高版本中的附加线程由 V8 创建,用于 GC 和动态重新编译。我自己的 JavaScript 以及所有回调在主线程中运行 - 在我的示例中为 (5157)。每个异步函数都在线程池 = libuv 上运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 2015-12-17
    • 1970-01-01
    • 2012-11-30
    • 2015-01-07
    相关资源
    最近更新 更多