在对node .js和libuv做一些研究时,我用UV_THREADPOOL_SIZE=1
启动了一个简单的节点服务器,并查看了stree,看看它实际使用了多少线程。
为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)是一个单一的"工人"线程吗?
- 在0.12和ijs 3.3中会发生什么?为什么比配置多出4个线程?
我不能说Node/V8部分,但一般来说,任何libuv应用程序都会使用至少1 + UV_THREADPOOL_SIZE线程。
第一个线程是通过调用uv_run运行libuv循环的线程,它通常是主线程。然后libuv有一个UV_THREADPOLL_SIZE大小的线程池,在这里运行文件系统和DNS操作。网络i/o通过epoll/kqueue等在循环线程中执行。