我如何使用简单的Express应用程序使用Node.js群集?

– 我构build了一个简单的应用程序,它从一个Redis数据库中提取数据(50个项目),并在本地主机上抛出。 我做了一个ApacheBench(c = 100,n = 50000),我在双核T2080 @ 1.73GHz(我的6哟笔记本电脑)上获得了150次请求/秒,但是使用过程非常令人失望,图所示: 在这里输入图像描述

只有一个核心使用,这是按照devise在节点,但我想我几乎可以加倍我的请求/秒〜300,甚至更多,如果我可以使用Node.js群集。 我摆弄了很多,但我一直无法弄清楚如何把这里给出的代码与我的应用程序一起使用,如下所示:

var express = require( 'express' ), app = express.createServer(), redis = require( 'redis' ).createClient(); app.configure( function() { app.set( 'view options', { layout: false } ); app.set( 'view engine', 'jade' ); app.set( 'views', __dirname + '/views' ); app.use( express.bodyParser() ); } ); function log( what ) { console.log( what ); } app.get( '/', function( req, res ) { redis.lrange( 'items', 0, 50, function( err, items ) { if( err ) { log( err ); } else { res.render( 'index', { items: items } ); } }); }); app.listen( 8080 ); 

我还想强调,应用程序是I / O密集型(不是CPU密集型的,这会使线程一个gogo比群集更好的select)。

会喜欢一些帮助,搞清楚这一点。

实际上,您的工作量并不是真正的I / O限制:由于基于玉石的dynamic页面生成的成本,它受CPU限制。 我不能猜测你的玉石模板的复杂性,但即使使用简单的模板,生成HTML页面也是昂贵的。

对于我的testing,我使用了这个模板:

 html(lang="en") head title Example body h1 Jade - node template engine #container ul#users each user in items li User:#{user} 

我在Redis中的项目键中添加了100个虚拟string。

在我的盒子里,我得到了475个req / s,node.js CPU达到了100%(这意味着这个双核心盒子消耗了50%的CPU)。 我们来replace:

 res.render( 'index', { items: items } ); 

通过:

 res.send( '<html lang="en"><head><title>Example</title></head><body><h1>Jade - node template engine</h1><div id="container"><ul id="users"><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li></ul></div></body></html>' ); 

现在,基准的结果是接近2700瑞克/秒。 所以这个瓶颈显然是由于HTML页面的格式造成的。

在这种情况下使用集群包是一个好主意,而且很简单。 代码可以修改如下:

 var cluster = require('cluster') if ( cluster.isMaster ) { for ( var i=0; i<2; ++i ) cluster.fork(); } else { var express = require( 'express' ), app = express.createServer(), redis = require( 'redis' ).createClient(); app.configure( function() { app.set( 'view options', { layout: false } ); app.set( 'view engine', 'jade' ); app.set( 'views', __dirname + '/views' ); app.use( express.bodyParser() ); }); function log( what ) { console.log( what ); } app.get( '/', function( req, res ) { redis.lrange( 'items', 0, 50, function( err, items ) { if( err ) { log( err ); } else { res.render( 'index', { items: items } ); } }); }); app.listen( 8080 ); } 

现在基准testing结果接近750 req / s,100%的CPU消耗(与最初的475 req / s相比)。