【问题标题】:Node.js clustering - 1 worker per core slows down main thread?Node.js 集群 - 每个核心 1 个工作人员会减慢主线程速度?
【发布时间】: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 流量的外观不同。

【问题讨论】:

  • 如何断言一个线程占用一个核心?

标签: node.js multithreading cluster-computing


【解决方案1】:

我相信主线程只是一个负载平衡器,只是将请求定向到每个派生/分叉的工作线程。因此,您的应用程序的每个核心运行一个线程 + 一个线程来管理请求。如果你有 os.cpus().length - 1 你将不会利用你所有的 cpu 核心。

【讨论】:

  • 正确。所以通常主线程不会做足够的工作来证明拥有自己的核心是合理的。但是,在我的情况下,我期望每个客户端每秒都会收到大量 UDP 数据包,这难道不是合理的吗?
  • 假设至少有 1000 个客户端发送数据包,他们希望每秒发送 30 - 60 个数据包。那么每秒大约 60,000 次?
  • 所以这让我失去了深度。这家伙每秒遇到超过 400 个数据包的问题,​​需要开始对数据包进行排队。 stackoverflow.com/questions/27867428/… 我的上一个项目是每秒处理 2000 个数据包 (TCP),只有两个内核,并且为这两个内核生成了工作人员。但是 60k pps 比我经历的要高。
  • 啊,我明白了。我对数据包频率的期望可能太高,所以实际的 pps 最终可能会低于我的预期。
  • 您是否尝试过使用 pm2 之类的进程管理进行集群,因为它会处理负载平衡和分叉应用程序?
猜你喜欢
  • 1970-01-01
  • 2017-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
  • 2018-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多