所以我有点关心我在网上找到的有关 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/