0

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

对于 Node.js 0.10pstree -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 个线程超过配置?
4

1 回答 1

2

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

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

于 2015-09-11T15:36:07.987 回答