我用JMeter创建测试来测试Ghost博客平台的性能。 Ghost用Node.js编写,安装在1Gb RAM,1个CPU的云服务器上。
我注意到400个并发用户JMeter收到错误后。直到400个并发用户负载是正常的。我决定增加CPU并增加1个CPU。
但错误再现并增加了2个CPU,共4个CPU。在400个并发用户之后出现问题。
我不明白为什么1个CPU可以处理400个用户,4个CPU可以处理相同的结果。
在监控期间,我注意到只有一个CPU忙,另外三个CPU闲置。当我在控制台中检查JMeter摘要时出现错误,大约是请求的5%。见截图。
我想知道是否可以平衡CPU之间的负载?
答案 0 :(得分:4)
您是否使用cluster
模块进行负载均衡和节点0.10.x?
如果是这样,请将您的node.js更新为0.11.x.
节点0.10.x使用的是操作系统提供的平衡算法。在0.11.x算法was changed中,从现在开始它将更均匀地分布。
答案 1 :(得分:2)
Node.js是着名的单线程(参见this answer):单个节点进程只使用一个核心(请参阅this answer以获得更深入的了解),这就是为什么你会看到您的程序完全使用一个核心,并且所有其他核心都处于空闲状态。
通常的解决方案是使用Node的cluster
core module,它可以帮助您启动Node进程集群来处理负载,允许您创建所有共享相同服务器端口的子进程。
但是,如果不修复Ghost的代码,就无法真正使用它。一个选项是使用pm2
,它可以包装节点程序,为您使用群集模块。例如,有四个核心:
$ pm2 start app.js -i 4
理论上这应该有效,除非Ghost依赖于某些全局变量(每个进程都无法共享)。
答案 2 :(得分:1)
使用集群核心和负载均衡nginx。这是关于node.js的不好的部分。神奇的框架,但开发人员必须进入负载平衡混乱。虽然java和其他运行时使得无缝。无论如何,没有什么是完美的。