我一直在阅读有关 NodeJS 上的多处理以获得最好的理解并尝试使用我的代码在繁重的环境中获得良好的性能。
虽然我了解利用资源处理负载的不同方式的基本目的和概念,但随着我深入研究,一些问题出现了,似乎我无法在文档中找到特定的答案。
单线程中的 NodeJS:
NodeJS 运行一个我们称之为事件循环的单线程,尽管在后台操作系统和 Libuv 正在处理 I/O 异步任务的默认工作池。
尽管工作人员可能使用不同的核心,但我们应该为事件循环使用单个核心。我想它们最终是由操作系统调度程序排序的。
NodeJS 作为多线程:
使用“worker_threads”库时,在同一个单进程中,每个线程运行不同的v8/Libuv实例。因此,它们共享相同的上下文并在具有“消息端口”和 API 其余部分的线程之间进行通信。
每个工作线程运行其事件循环线程。线程应该在 CPU 内核之间明智地平衡,从而提高性能。我想它们最终是由操作系统调度程序排序的。
问题 1:当工作人员使用 I/O 默认工作人员池时,是否以某种方式共享与其他工作人员池相同的线程?或者每个工人都有自己的默认工人池?
多处理中的NodeJS:
使用“集群”库时,我们将工作拆分到不同的进程中。每个进程都设置在不同的核心上以平衡负载......好吧,主事件循环最终设置在不同的核心中,因此它不会与另一个重事件循环共享核心。这样做听起来很聪明。
在这里,我将与一些 IPC 策略进行交流。
问题 2:这个 NodeJS 进程的默认工作池?他们在哪里?在第一种情况下如预期的那样在其余核心之间保持平衡?然后我猜它们可能与集群的其他工作池位于相同的核心上。说我们正在平衡主线程(事件循环)而不是“进程”不是更好吗?
说了这么多,主要问题是:
问题三:clustering好还是worker_threads好?如果两者都在同一代码中使用,那么两个库如何才能获得最佳性能?或者他们只是可以简单地发生冲突?或者最终是控制权的操作系统?
我清楚地看到集群方法,因为它部署了不同的整个流程。我猜专业程序员出于某种充分的原因创建了“worker_threads”库......但我仍然需要澄清这一点以加深我的理解:
在正常的单线程进程中,事件循环线程借助默认工作池来卸载其繁重的 I/O 任务,因此主线程不会被阻塞。
同时,出于同样的原因,用户定义的“工作线程”将与它们自己的事件循环和 NodeJS 实例一起使用。
当这些事件循环和 Nodejs 实例不是瓶颈时,生成这些事件循环和 Nodejs 实例有什么意义,因为 libuv 旨在设法生成工作线程。
这是否意味着默认工作池可能不够?我的意思只是数量问题还是概念?
我知道 pm2 日志可以用 来显示pm2 logs,而我可以指定相同的内容来仅观看一个进程输出,例如pm2 logs myprocess.
这两种情况在doc中都有很好的描述。
我想知道如何选择我的列表中的一些或如何仅输出生态系统文件中的那些,但我看不到方法。
我尝试指定生态系统文件,在命令行中列出文件(用逗号或空格分隔),在命令行中列出进程(用逗号或空格分隔),但它不起作用。