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 个工作人员会减慢主线程速度?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 集群 - 最佳工作人员数量

Node.js 集群

Node.js 集群共享缓存

使用PM2管理Node.js集群

Node.js使用PM2的集群将变得更加容易

10.Node.js核心模块