Node.js 集群 - 每个核心 1 个工作人员会减慢主线程速度?
Posted
技术标签:
【中文标题】Node.js 集群 - 每个核心 1 个工作人员会减慢主线程速度?【英文标题】:Node.js clustering - 1 worker per core slows down main thread? 【发布时间】:2019-01-07 02:07:59 【问题描述】:所以我有点担心我在网上找到的关于 node.js 集群的示例代码,例如:
if (cluster.isMaster)
console.log('Initializing...');
// Fork workers.
for (let i = 0; i < os.cpus().length; i++)
cluster.fork();
else
doWork();
对于具有 4 个物理内核的系统,此代码将为每个内核分叉 4 次。这意味着我们最终得到了主线程 + 4 个工作线程 == 5 个线程。
看来我们的工人数量超出了我们的处理能力!为了保证主线程正常运行,代码不应该是:os.cpus().length - 1
,这样我们就留一个核给主线程工作吗?
出于我的目的
我正在运行一个 UDP 服务器,我希望一半的工作人员处理传入的数据包,另一半在 setInterval 函数内每秒发送大量数据包。
我不希望主线程(正在执行负载平衡)和处理传入数据包的工作线程之间有任何延迟,因此我想确保主线程以 100% 的速度工作。
在这种情况下,我会在我的 fork 循环中使用os.cpus().length - 1
,还是使用os.cpus().length
?
提前致谢!
编辑:我注意到有一个与我的问题类似的问题,答案解释说主线程通常在分发上花费的时间很少,因此保留一个可用内核可能会使该内核空闲。我相信这对于 TCP/IP 来说是正确的,但在我的情况下,我预计每个“连接”到我的服务器的客户端每秒大约有 30-60 个数据包,因此将会有源源不断的数据包流入,这可能与 TCP/IP 流量的外观不同。
【问题讨论】:
如何断言一个线程占用一个核心? 【参考方案1】:我相信主线程只是一个负载平衡器,只是将请求定向到每个派生/分叉的工作线程。因此,您的应用程序的每个核心运行一个线程 + 一个线程来管理请求。如果你有 os.cpus().length - 1 你将不会利用你所有的 cpu 核心。
【讨论】:
正确。所以通常主线程不会做足够的工作来证明拥有自己的核心是合理的。但是,在我的情况下,我期望每个客户端每秒都会收到大量 UDP 数据包,这难道不是合理的吗? 假设至少有 1000 个客户端发送数据包,他们希望每秒发送 30 - 60 个数据包。那么每秒大约 60,000 次? 所以这让我失去了深度。这家伙每秒遇到超过 400 个数据包的问题,需要开始对数据包进行排队。 ***.com/questions/27867428/… 我的上一个项目是每秒处理 2000 个数据包 (TCP),只有两个内核,并且为这两个内核生成了工作人员。但是 60k pps 比我经历的要高。 啊,我明白了。我对数据包频率的期望可能太高,所以实际的 pps 最终可能会低于我的预期。 您是否尝试过使用 pm2 之类的进程管理进行集群,因为它会处理负载平衡和分叉应用程序?以上是关于Node.js 集群 - 每个核心 1 个工作人员会减慢主线程速度?的主要内容,如果未能解决你的问题,请参考以下文章