Node.js CPU负载均衡

5
我使用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在忙碌,其他3个CPU处于空闲状态。当我在控制台中检查JMeter摘要时,会出现错误,请求错误率约为5%。请参阅屏幕截图。
我想知道是否有可能在多个CPU之间平衡负载?

4
你可能还想用ulimit -n检查你的打开文件限制。这会限制Node可以处理的并发请求数量。你可以使用ulimit -n 10000来增加它(针对本地会话)。要创建一个Ghost服务器进程集群,你可以尝试使用pm2。只需使用npm install pm2 -g安装pm2,并使用pm2 start <your_server>.js启动它。 - Mukesh Soni
问题已经部分解决,以下是我所采取的步骤和结果:
  1. 将ulimit更改为10000,结果:无变化。
  2. 启用Node集群模块,结果:+200并发用户。
  3. 调整Nginx工作进程,结果:+2k并发用户。
我可以推断问题出在Nginx上。当我在没有使用集群模块的服务器上进行测试时,服务器可以处理2000个用户。当达到极限时,我将尝试启用集群模块。
- Bob Meliev
3个回答

4

你正在使用cluster模块来进行负载均衡和Node 0.10.x吗?

如果是这样,请将您的node.js更新到0.11.x以上。

Node 0.10.x使用操作系统提供的负载均衡算法,在0.11.x中算法已更改,因此现在将更加均匀地分配。


3
Node.js 以单线程著称(请参见此答案)。单个节点进程仅使用一个内核(请参见此答案以了解更深入的信息),这就是为什么您会看到程序完全使用一个内核,而所有其他内核都处于空闲状态。
通常的解决方案是使用 Node 的cluster 核心模块,该模块可以帮助您启动一组 Node 进程来处理负载,通过允许您创建共享相同服务器端口的子进程。
但是,在修复 Ghost 代码之前,您无法真正使用它。一个选择是使用pm2,它可以为您使用集群模块包装一个节点程序。例如,使用四个内核:
$ pm2 start app.js -i 4

理论上这应该可以工作,但如果Ghost依赖于一些全局变量(每个进程都无法共享),那么就不起作用了。


一个替代pm2自动利用更多核心的选择是通过Phusion Passenger运行节点应用程序 - https://github.com/phusion/passenger/wiki/Phusion-Passenger%3A-Node.js-tutorial#wiki-maximum-number-of-processes - Karolis
乘客是免费的还是需要付费? - Rizwan Patel

2

使用集群核心以及负载均衡的 nginx,来进行负载均衡。这是 node.js 的一个不好的方面。它是一个出色的框架,但开发者必须处理负载均衡混乱的问题。相比之下,Java和其他运行时使其无缝。不过,没有什么是完美的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接