Node.js 集群 - 每个核心 1 个工作线程会减慢主线程速度?

标签 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 个物理核心的系统,此代码将为每个核心 fork 4 次。这意味着我们最终得到主线程 + 4 个工作线程 == 5 个线程。

看来我们多了一名 worker ,无法处理!为了确保主线程正常运行,代码不应该是:os.cpus().length - 1,这样我们就可以为主线程留下一个可用的核心吗?

为了我的目的

我正在运行一个 UDP 服务器,我希望一半的工作人员处理传入的数据包,另一半在 setInterval 函数内每秒发送大量数据包。

我不希望主线程(正在执行负载平衡)和处理传入数据包的工作线程之间有任何延迟,因此我想确保主线程以 100% 的速度工作。

在这种情况下,我会在 fork for 循环中使用 os.cpus().length - 1 ,还是会使用 os.cpus().length

提前致谢!

编辑:我注意到有一个与我的问题类似的问题,答案解释说主线程通常在分配上花费很少的时间,因此留下一个可用的核心可能会使该核心闲置。我相信 TCP/IP 确实如此,但就我而言,我预计每个“连接”到我的服务器的客户端每秒大约有 30-60 个数据包,因此将会有持续不断的数据包流入,这可能与 TCP/IP 流量的情况有所不同。

最佳答案

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

关于Node.js 集群 - 每个核心 1 个工作线程会减慢主线程速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54067800/

相关文章:

cassandra - 构建 Cassandra 集群?

mysql - 在 Electron 中使用 mysql

macos - 启动服务器后退出node.js的正确方法是什么?

C++ 协作

c# - 多线程场景调用Dictionary对象的set_item方法抛出NullReferenceException

CouchDB 集群 : Impossible to set it up

docker - 在具有共享文件系统的计算集群上安装 docker

javascript - Node.js MongoDB 套接字关闭错误

node.js - 使用 Bot Framework 代表用户发送消息

java - 更新后两个线程看到相同的值