node.js 和 libuv 如何使用不同的线程?
How do node.js and libuv use the different threads?
在对 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
我还尝试为线程池大小设置更高的数字,以确保我不低于某个最小值。
我的问题是:
- 在主进程(5157)上执行什么,在下面的线程上执行什么?
- 我们可以假设这里 (5158) 是 libuv 的线程 ID 而 (5162) 是单个 "worker" 线程吗?
- 0.12 和 iojs 3.3 发生了什么?为什么最多比配置多 4 个线程?
我不能真正代表 Node/V8 部分,但一般来说,amy libuv 应用程序将至少使用 1 + UV_THREADPOOL_SIZE 个线程。
第一个线程是 运行 通过调用 uv_run 执行 libuv 循环的线程,通常是主线程。 libuv 然后有一个 UV_THREADPOLL_SIZE 大小的线程池,其中文件系统和 DNS 操作是 运行。 Networki/o在loop线程中使用epoll/kqueue等执行
在对 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
我还尝试为线程池大小设置更高的数字,以确保我不低于某个最小值。
我的问题是:
- 在主进程(5157)上执行什么,在下面的线程上执行什么?
- 我们可以假设这里 (5158) 是 libuv 的线程 ID 而 (5162) 是单个 "worker" 线程吗?
- 0.12 和 iojs 3.3 发生了什么?为什么最多比配置多 4 个线程?
我不能真正代表 Node/V8 部分,但一般来说,amy libuv 应用程序将至少使用 1 + UV_THREADPOOL_SIZE 个线程。
第一个线程是 运行 通过调用 uv_run 执行 libuv 循环的线程,通常是主线程。 libuv 然后有一个 UV_THREADPOLL_SIZE 大小的线程池,其中文件系统和 DNS 操作是 运行。 Networki/o在loop线程中使用epoll/kqueue等执行