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

Why Node.js spins 7 threads per process

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

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

此外,还有一个线程用于执行您的Javascript,因此占 5.

然后,垃圾收集器似乎使用了一个线程来对对象进行后台标记(根据 ) and this article。那将是 6。

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

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

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


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