当一个Node.js进程被旋转时,top命令显示附加到该进程的7个线程。这些线程都在做什么?此外,随着API上的负载增加,请求处理程序本身异步地等待其他上游API调用,节点是否会产生额外的工作线程?我在上面看到它能做到这一点。但我在想,这种情况只发生在文件I/o上,为什么它需要这些额外的工作线程?
发布于 2020-05-01 21:55:17
LIBUV ( node.js内置的底层跨平台系统库)使用线程池进行某些操作,例如磁盘I/O和一些密码操作。默认情况下,线程池包含4个线程。
另外,还有一个用于执行Javascript的线程,这样就占了5。
然后,垃圾收集器似乎有一个线程用于对象的背景标记(每个来自V8开发人员的此引用)和这篇文章。那就等于6了。
我不知道第七张会是什么。事件循环本身可能使用一个线程。
然后,从2018年前后的某个时间开始,似乎nodejs为DNS请求切换到了一组单独的线程(与文件I/O线程池分开)。这可能是因为node.js中存在问题,其中4个缓慢的DNS请求可能会阻塞所有文件I/O,因为它们接管了线程池。因此,现在看来node.js使用了C图书馆作为DNS,它生成了自己的一组线程。
FYI,您实际上可以使用UV_THREADPOOL_SIZE环境变量来控制线程池大小。
当然,您也可以创建自己的Worker线程,这些线程实际上创建了V8 Javascript执行引擎的新实例(因此它们可能最终会创建多个新线程)。
https://stackoverflow.com/questions/61550822
复制相似问题