之前和PHP同事讨论过node.js的性能,看了一些node.js的相关文档。除了非阻塞 I/O 和快速开发的优点之外,node.js 还有明显的缺点:
1. 单进程,只支持单核CPU,不能充分利用多核CPU服务器。
2.单个进程,一旦这个进程崩溃,整个web服务就崩溃了。(当然这可以通过代码的健壮性来弥补)
开发环境:
红帽虚拟机
CPU:两个
内存:1GB
请告知以下是否有问题:
最近借助node.js开发了一套在线聊天室应用,简单实现了大厅聊天、私聊、群聊。用户信息、群组成员信息、聊天内容都是使用redis存储的。
具体聊天室的功能请参考我的博客:
现在如果要1个CPU绑定一个node.js聊天室进程,需要使用这个命令:,(具体请参考相关文档)
在linux下运行:
节点.js
节点.js
我将 .js 监听端口设置为 8888,将 .js 监听端口设置为 8889。
OK,现在2个node.js聊天室程序启动了。但是需要注意的是,这2个聊天室是不能互相聊天的,但是user表是一个,正好他是两个不同的房间。聊天室代码是一套,只是.js的一份拷贝,里面监控着不同的端口。
然后我们要给两个node.js进程绑定不同的CPU:(目前我的虚拟机有2个CPU)
ps -ef | grep node(用于查看节点的进程号)
根 19277 2517 15 10:12 pts/1 00:00:20 节点 /usr/local/node/src//.js
根 19283 2566 18 10:13 pts/2 00:00:20 节点 /usr/local/node/src//.js
根 19291 2384 0 10:15 pts/0 00:00:00 grep 节点
找到上述2个PID后,将它们用于CPU绑定。命令如下:(这里只写一个)
-pc 0 19277(其中 0 是 CPU0,依此类推)
pid 19277 的列表:0,1
pid 19277 的新列表:0
出现上面的信息就说明绑定成功了,用同样的方法再绑定一个。
绑定结束后,我们如何知道它们在不同的 CPU 上运行?再找一个虚拟机,安装,对两个node.js聊天室端口进行压力测试,然后使用top命令查看每个CPU的使用情况。(提示,输入TOP命令,然后按数字“1”,压力测试时一直按“ENTER”),结果显示CPU0的使用率长时间保持在60%以上,而CPU0的使用率CPU1在压力测试中长时间低于20%。长时间保持在60%,而CPU0保持在20%以下,结果说明绑定成功!(之前有过一次乌龙,用自己的虚拟机压测,结果发现这两个CPU的利用率很高多核服务器,查不出问题。后来,
然后安装nginx并配置nginx,只需在配置文件中添加:(具体的nginx安装和设置请参考相关文档)
{
10.1.1.202:8888=1;
10.1.1.202:8889=1;
}
{
80;
10.1.1.202;
/
{
;
主机 10.1.1.202:80;
X–对于$;
}
然后软重启nginx服务,访问地址10.1.1.202的80端口,这样nginx就可以做反向代理和负载均衡了。
注意:以上配置需要node.js服务器代码的良好支持。存储推荐使用redis,这样可以共享,否则需要使用(具体的nginx优化配置请参考相关文档),在多核CPU上运行多个节点。js进程之间的内存是不共享的,需要牢记。
由于之前对node.js的空框架进行过压力测试,发现它的内存消耗不是很高,所以理论上如果4核cpu和内存超过8G,打开4个node.js进程运行在一个服务器,使用 Nginx 做负载均衡,其性能和稳定性相比单一的 node.js 应该会有很大的提升。