增加集群中的工作人员数量不再增加总体性能

Increase worker amount in cluster does not increase total performance anymore

我正在试验 Node.js cluster features along with 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 的 iMac CPU)

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

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

所以我的问题是:为什么当实例数达到 5 时性能会下降?看来增加实例并不能再提高性能了。

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

如果您向请求处理程序添加一个 100 毫秒的自旋循环以创建实际的 CPU 负载,您可能会看到截然不同的结果,添加更多 CPUs 应该会带来更多好处。请记住,更多 CPU 仅在您实际 CPU 绑定时才有帮助。

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

而且,最准确的服务器配置测试是当客户端负载在不同的主机上并且您实际使用网络来 send/receive 请求时。本地主机请求实际上并不通过网络。