Node.js集群-每个内核1个工作线程会降低主线程的速度吗?

时间:2019-01-07 02:08:00

标签: node.js multithreading cluster-computing

因此,我有点担心在涉及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%的速度工作。

在那种情况下,我应该在分支for循环中使用os.cpus().length - 1,还是使用os.cpus().length

谢谢!

编辑:我注意到那里有一个与我的问题类似的问题,并且答案说明,主线程通常在分配上花费很少的时间,因此保留一个可用的内核可能会使该内核处于空闲状态。我相信这对于TCP / IP是正确的,但就我而言,我希望每个“连接”到我的服务器的客户端每秒大约30至60个数据包,因此会有不断的数据包流入,这可能与TCP / IP流量的外观不同。

1 个答案:

答案 0 :(得分:0)

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