Node.js 集群 - 最佳工作人员数量
Posted
技术标签:
【中文标题】Node.js 集群 - 最佳工作人员数量【英文标题】:Node.js cluster - optimal number of workers 【发布时间】:2017-01-23 12:02:05 【问题描述】:我有 4 个核心并根据this example 运行此代码:
var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;
var id = 0;
if (cluster.isWorker)
id = cluster.worker.id;
var iterations = 1000000000;
console.time('Function #' + id);
for (var i = 0; i < iterations; i++)
var test = 0;
console.timeEnd('Function #' + id);
if (cluster.isMaster)
// Fork workers.
for (var i = 0; i < numCPUs; i++)
cluster.fork();
有了 4 个 fork(上面的代码),我得到了:
函数#0:1698.801ms
函数#1:3282.679ms
函数#4:3290.384ms
函数#3:3425.090ms
函数 #2:3424.922ms
用 3 个叉子,我得到了:
函数#0:1695.155ms
函数#2:1822.867ms
函数#3:2444.156ms
函数#1:2606.680ms
用 2 个叉子,我得到了:
函数#0:1684.929ms
函数 #1:1682.897 毫秒
函数#2:1686.123ms
我不明白这些结果。 1 fork/core 不是 最佳 数字吗?在这里我看到 4 叉并不比 2 叉好。
【问题讨论】:
【参考方案1】:我的猜测是您的硬件实际上只有 2 个物理内核。但是,由于hyper-threading (HT),操作系统会说存在 4 个(逻辑)内核。
您代码中的工作人员将一个(物理)核心完全占用,这是 HT 无法很好处理的事情,因此让所有 4 个逻辑核心都处于忙碌状态时的性能会比只保留 2 个时更差物理内核繁忙。
我的硬件(四核,即 4 个物理核心和 8 个逻辑核心)显示相同的模式:
8 名工人:
Function #5: 926ms
Function #3: 916ms
Function #1: 928ms
Function #4: 895ms
Function #7: 934ms
Function #6: 905ms
Function #8: 928ms
Function #2: 928ms
4 名工人:
Function #3: 467ms
Function #2: 467ms
Function #1: 473ms
Function #4: 472ms
也就是说,如果您的工作人员受 I/O 限制(大多数 Node 应用程序都是),那么使工作人员数量等于硬件中逻辑内核数量的经验法则仍然有意义。
如果您真的想执行繁重的阻塞计算,请为每个工作人员计算一个物理核心。
【讨论】:
感谢您的信息。那么对于 Node.js,另一半核心仅用于异步代码吗?它是否需要集群,或者这是否意味着 Node.js 仅使用一个执行线程但 也 其他并行线程(〜核心?)用于异步代码?此外,当我正在开发游戏时,它主要受 CPU 限制。但是我在 github 的工作中看到了一些setTimeout(updateClients, 0);
在 mainloop 中,因为“异步更新提高了性能”。他们是对的吗?
节点本身不安排任何事情,这取决于操作系统(以及 CPU 本身)。如果您有 CPU 绑定代码,cluster
可以帮助您,因为它允许您在单独的进程中运行 CPU 密集型代码,操作系统可以将其调度到不同的代码上作为应用程序的“主要”部分.如果您在同一个进程中将 I/O 密集型和 CPU 密集型内核混合在一起,则使用 setTimeout()
技巧很有用。以上是关于Node.js 集群 - 最佳工作人员数量的主要内容,如果未能解决你的问题,请参考以下文章
最佳实践 beanstalkd (queue) 和 node.js