Node.js 集群 - 每个内核 1 个 worker 会减慢主线程?
Node.js clustering - 1 worker per core slows down main thread?
所以我有点担心我在网上找到的关于 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-loop 分支中使用 os.cpus().length - 1
,还是会使用 os.cpus().length
?
提前致谢!
编辑:我注意到那里有一个与我的问题类似的问题,答案解释说主线程通常在分配上花费的时间很少,因此留下一个核心可用可能会使该核心闲置。我相信 TCP/IP 确实如此,但在我的情况下,我预计每个客户端 "connected" 每秒大约有 30-60 个数据包到我的服务器,因此会有源源不断的数据包流in,这可能与 TCP/IP 流量的样子不同。
我认为主线程只是一个负载平衡器,只是将请求定向到每个 spawned/forked 工作线程。因此,您的应用程序的每个核心都有一个线程 运行 + 一个线程来管理请求。如果你有 os.cpus().length - 1 你将不会利用你所有的 cpu 核心。
所以我有点担心我在网上找到的关于 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-loop 分支中使用 os.cpus().length - 1
,还是会使用 os.cpus().length
?
提前致谢!
编辑:我注意到那里有一个与我的问题类似的问题,答案解释说主线程通常在分配上花费的时间很少,因此留下一个核心可用可能会使该核心闲置。我相信 TCP/IP 确实如此,但在我的情况下,我预计每个客户端 "connected" 每秒大约有 30-60 个数据包到我的服务器,因此会有源源不断的数据包流in,这可能与 TCP/IP 流量的样子不同。
我认为主线程只是一个负载平衡器,只是将请求定向到每个 spawned/forked 工作线程。因此,您的应用程序的每个核心都有一个线程 运行 + 一个线程来管理请求。如果你有 os.cpus().length - 1 你将不会利用你所有的 cpu 核心。