为什么 Node.js 每个进程旋转 7 个线程

cub*_*nux 2 javascript worker-thread node.js

当 Node.js 进程启动时,top 命令显示有 7 个线程附加到该进程。所有这些线程都在做什么?此外,随着 API 负载的增加,请求处理程序本身会异步等待其他上游 API 调用,Node 是否会产生额外的工作线程?我在顶部看到它确实做到了这一点。但我认为这只发生在文件 I/O 上。为什么需要这些额外的工作线程?

jfr*_*d00 7

LIBUV(node.js 构建的底层跨平台系统库)使用线程池来执行某些操作,例如磁盘 I/O 和一些加密操作。默认情况下,线程池包含 4 个线程。

另外,还有一个线程用于执行 Javascript,因此占 5 个。

然后,垃圾收集器似乎使用一个线程来进行对象的后台标记(根据V8 开发人员的此参考)和本文。这样就可以得到 6 个。

我不确定第七个会是什么。事件循环本身可能使用一个线程。

然后,从 2018 年左右开始,nodejs 似乎切换到一组单独的线程来处理 DNS 请求(与文件 I/O 线程池分开)。这可能是因为 Node.js 中存在问题,其中 4 个缓慢的 DNS 请求可能会阻塞所有文件 I/O,因为它们接管了线程池。所以,现在看来,node.js 使用了DNS 的C-ARES 库,它创建了自己的线程集。

仅供参考,您实际上可以使用环境变量控制线程池大小UV_THREADPOOL_SIZE


当然,您可以创建自己的工作线程,这些线程实际上创建 V8 Javascript 执行引擎的新实例(因此它们最终可能会创建多个新线程)。