【发布时间】:2022-01-20 09:34:33
【问题描述】:
我正在试验 Node.js cluster 和 PM2 的功能,这是我用于测试的小脚本:
// 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