让node.js充分利用多核服务器的性能

标签: 学习 node.js多核 node.js负载均衡 node.js反向代理 node.js性能 node.js nginx taskset | 发表时间:2011-08-30 10:22 | 作者:snoopy genedna
出处:http://cnodejs.org/blog

之前和PHP同事讨论node.js的性能问题,看了一些node.js的相关文档,node.js除了拥有非阻塞I/O,快速开发等诸多优点外,其缺点也很明显:

1、单进程,只支持单核CPU,不能充分的利用多核CPU服务器。
2、单进程,一旦这个进程崩掉,那么整个web服务就崩掉了。(当然这个可以通过代码的健壮性来弥补)
开发环境:
vMware Red Hat 虚拟机
CPU: 两个
内存:1GB
以下有说的不对的地方还请多多指教:

近期我借助node.js开发了一套网络聊天室的应用,简单实现了大厅聊天,私聊,群聊。用户信息、群组成员信息和聊天内容等借用redis进行存储。
具体聊天室的功能请参阅我的博客:http://snoopyxdy.blog.163.com/blog/static/60117440201172510426330/
现在想要1个CPU绑定一个node.js聊天室进程,需要借助这个命令:taskset,(具体请参阅相关文档)
在linux下运行: 
node server.js
node server0.js
我设定server.js监听端口为8888,server0.js监听端口为8889.
OK,现在2个node.js聊天室程序启动起来了。但是要注意,这2个聊天室不能相互聊天,但是用户表是一个,就当他是两个不同的房间把。聊天室代码是一套,只是拷贝了一份server.js,在里面监听了不同的端口。
然后我们要对这两个node.js的进程绑定不同的CPU:(目前我的虚拟机就2个CPU)
ps -ef | grep node  (用来查看node的进程号)
root     19277  2517 15 10:12 pts/1    00:00:20 node /usr/local/node/src/chating_express/server.js
root     19283  2566 18 10:13 pts/2    00:00:20 node /usr/local/node/src/chating_express/server0.js
root     19291  2384  0 10:15 pts/0    00:00:00 grep node
找到了上述2个PID后,就利用taskset来进行CPU绑定,命令如下:(这里只写其中一个)
taskset -pc 0 19277  (其中0代表CPU0,以此类推)
pid 19277's current affinity list: 0,1
pid 19277's new affinity list: 0
出现上述信息代表绑定成功,同样方法绑定另外一个。
绑定结束后我们怎么知道他们运行在不同的CPU上呢?找另外一台虚拟机,装好webbench,分别对两个node.js聊天室端口进行压力测试,然后用top命令查看各个CPU的使用情况,(小窍门,输入TOP命令,然后按数字“1”,在压力测试时不停的按“ENTER”),结果表明在压力测试server.js端口时CPU0使用率长期保持在60%以上而CPU1则使用率长期在20%以下,而测试server0.js端口时,CPU1长期保持在60%,而CPU0则保持在20%以下,结果表明绑定成功!(之前曾经乌龙了一次,用自己的虚拟机webbench压力测试,结果发现2个CPU使用率都很高,一直检查不出问题,后来发现webbench也要使用CPU的,泪奔!!!)
然后安装nginx,对nginx进行配置,只需在配置文件中加入:(具体nginx的安装和设置请参阅相关文档)
upstream node_server_pool {
server 10.1.1.202:8888 max_fails=1;
server 10.1.1.202:8889 max_fails=1;
}
server
{
listen       80;
server_name 10.1.1.202;
location /
{
proxy_pass http://node_server_pool;
proxy_set_header Host 10.1.1.202:80;
proxy_set_header X-Forwarded-For $remote_addr;
}
然后软重启nginx服务,访问10.1.1.202这个地址80端口,就可以让nginx做反向代理了和负载均衡了。
注:上述的这些配置需要node.js服务端代码良好的支持,session的存储建议使用redis,这样可以共享session否则需要用到ip_hash了(具体nginx优化配置请参阅相关文档),在多核CPU上跑多个node.js进程他们之间的内存是不共享的,这点需要牢记啊。
由于之前曾经压力测试过node.js的空框架,发现其内存消耗并不是很高,所以理论上来说,如果4核cpu且内存8G以上,开4个node.js进程跑在一个服务器上,用nginx做负载均衡,其性能和稳定性都应该比单个node.js提升很大。

相关 [node js 利用] 推荐:

node js 断点调试

- - Web前端 - ITeye博客
大部分基于 Node.js 的应用都是运行在浏览器中的,. 例如强大的调试工具 node-inspector. node-inspector 是一个完全基于 Node.js 的开源在线调试工具,提供了强大的调试功能和友好. 的用户界面,它的使用方法十分简便. 首先,使用 npm install -g node-inspector 命令安装 node-inspector,然后在终.

什么是Node?

- We_Get - 博客园新闻频道
译者按:前不久Oreilly出了一本小册子“What is Node?”,扼要的讲解了Node的身世和所适用的场景,作者文笔轻松流畅、内容充实,是非常难得的学习资料.   译文全文:http://jayli.github.com/whatisnode/index.html.   作者:Brett McLaughlin ,原文:What is Node?.

Node入门

- - CSDN博客编程语言推荐文章
作者:  Manuel Kiessling. 翻译:  goddyzhao &  GrayZhang &  MondayChen. 本书致力于教会你如何用Node.js来开发应用,过程中会传授你所有所需的“高级”JavaScript知识. 本书绝不是一本“Hello World”的教程. 你正在阅读的已经是本书的最终版.

浅析Hadoop Secondary NameNode,CheckPoint Node,Backup Node

- - CSDN博客云计算推荐文章
Hadoop SecondaryNameNode并不是Hadoop 第二个NameNode,它不提供NameNode服务,而仅仅是NameNode的一个工具. 这个工具帮助NameNode管理Metadata数据. NameNode的HDFS文件信息(即Metadata)记录在内存中,client的文件写操作直接修改内存中的Metadata,同时也会记录到硬盘的Edits文件,这是一个Log文件.

[译]什么是Node?

- blacktulip - Taobao UED Team
译者按:前不久Oreilly出了一本小册子“What is Node?”,扼要的讲解了Node的身世和所适用的场景,作者文笔轻松流畅、内容充实,是非常难得的学习资料. 译文全文:http://jayli.github.com/whatisnode/index.html. 作者:Brett McLaughlin ,原文:What is Node?.

用node作桌面开发

- InterMa - CNode社区
node的定位是,server-side javascript. 但程序员最爱做的事,就是把一个东西用在不该用的地方. 那么,可以把node用在桌面开发上吗. 把Javascript用在桌面开发上,早有先例,比如GTK+的gjs,还有Qt的QML(顺带一提,QML代表着桌面开发的另一个方向,a promising way),GNOME3中,也用javascript作为桌面插件的开发语言.

無痛安裝 NodeJS 和 Node Framework Express

- Hming - 小惡魔 - 電腦技術 - 工作筆記 - AppleBOY
直接到官網下載 Stable 的版本吧,目前是 node-v0.4.10.tar.gz,也可以先看看 API Document. 安裝 Ububtu 相關套件. 下面會使用最原始的編譯方式,所以必須安裝 g++ 套件,否則下 ./configure 的時候,會吐出來沒有安裝過的套件. 兩種方法:1.用 apt-get install nodejs 2.

nodejs上HTML分析利器node-jquery

- - 博客园_首页
      首先描述产生这篇随笔的场景:我需要获取项目在jenkins构建的最新Javascript Coverage显示在供管理层次查看的项目情况Report上,但是由于jenkins没有直接的API取得数据所需数据,所以我们只能从自建的容器发布Javascript Coverage数据API,供Report项目使用.

我们为什么使用Node

- - 移动开发 - ITeye博客
引言:Node 已经迅速成为一个可行并且真正高效的web 开发平台. 在Node 诞生之前,在服务端运行JavasScript 是件不可思议的事情,并且对其他的脚本语言来说,要实现非阻塞I/O 通常需要依赖特殊的类库. 但Node 的出现改变了这一切. 本文选自《Node.js硬实战:115个核心技巧》,让我们跟着本文快速的复习一下Node是什么以及他的主要特性有哪些.