【问题标题】:Increase worker amount in cluster does not increase total performance anymore增加集群中的工作人员数量不再提高总体性能
【发布时间】:2022-01-20 09:34:33
【问题描述】:

我正在试验 Node.js clusterPM2 的功能,这是我用于测试的小脚本:

// server.js
import { createServer } from 'http'

const { pid } = process
const server = createServer((req, res) => {
  res.end(`Hello from ${pid}`)
})

server.listen('8080', () => console.log(`Started at ${pid}`))

我使用wrk 进行负载测试:

wrk -c 200 -d 10 -t 4 http://localhost:8080

我使用 PM2 启动 server.js 并使用 wrk 执行负载测试,为每个测试添加一个正在运行的服务实例。结果如下:

server.js with 1 instance   --> Requests/sec:  46139.15
server.js with 2 instances  --> Requests/sec:  89343.35
server.js with 3 instances  --> Requests/sec:  124294.58
server.js with 4 instances  --> Requests/sec:  137826.08
server.js with 5 instances  --> Requests/sec:  134193.62
server.js with 12 instances --> Requests/sec:  123073.60

(所有操作都在我的本地机器上执行,这是一台配备 Intel i9-9900K(16 逻辑核心)@ 3.60GHz CPU 的 iMac)

如您所见,从 4 个实例开始,性能提升越来越小。并且从 5 个实例的实验开始,性能反而下降(我可以确认此时网络负载没有达到最大值,仅为 65MB/s,而网卡的容量为 1GB /s)。

另外一个奇怪的行为是,随着实例数量的增加,测试时cpu使用率也会增加,但性能如前所述。

所以我的问题是:为什么当实例达到 5 时性能会下降?添加实例似乎不再提高性能。

【问题讨论】:

  • 您是否在与服务器相同的主机上运行负载测试程序?如果是这样,您会将客户端置于同一组 CPU 中,从而混淆了测试结果。此外,对 localhost 的测试根本不会通过您的网卡。您确实需要将负载测试器从同一主机上移到网络上,才能对实际性能进行任何有意义的测量。
  • 你能展示你的集群代码吗?您目前只显示单个实例的代码。
  • @jfriend00 你好,我在本地机器上运行了包括压力测试在内的所有动作,但是当实例数量为 5 时,CPU 使用率只有 50% 左右。并且我使用pm2启动集群:pm2 start server.js -i 5,通过pm2 scale命令扩展服务器。
  • 那么,您实际上并没有自己使用编码 nodejs 集群?但是,完全依赖 PM2?我不知道这有多有效。
  • 好吧,在同一台主机上运行压力测试的客户端永远不会让你得到明确的结果。

标签: node.js performance cluster-computing worker


【解决方案1】:

由于您的服务器实际上并没有做太多 CPU 密集型工作,因此您可能根本不受 CPU 限制(您的低 CPU 使用率也意味着这一点)。在达到 CPU 限制之前,您可能会受到网络限制或其他一些瓶颈。因此,当您添加超出某个级别的 CPU 时,您不会看到任何好处。

如果您在请求处理程序中添加一个 100 毫秒的自旋循环来创建实际的 CPU 负载,您可能会看到非常不同的结果,并且添加更多 CPU 应该会显示出更多好处。请记住,更多 CPU 仅在您实际受 CPU 限制时才有帮助。

另外,请记住,如果您的处理器有 8 个真正的超线程内核,看起来有 16 个内核,那么额外的 8 个实际上只是“更高效”的线程。如果您不进行大量线程上下文切换,那么那些额外的 8 个虚拟 CPU 可能不会提供任何真正的好处。

而且,最准确的服务器配置测试将是当客户端负载在不同的主机上并且您实际使用网络发送/接收请求时。 localhost 请求实际上并不通过网络。

【讨论】:

    猜你喜欢
    • 2017-01-23
    • 2022-01-14
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    相关资源
    最近更新 更多