Javascript 如何在simple Express应用程序中使用Node.js群集?
-我构建了一个简单的应用程序,可以从Redis DB中提取数据(50项),并将其上传到localhost。我做了一台ApacheBench(c=100,n=50000),在双核T2080@1.73GHz(我的6 y.o笔记本电脑)上,我得到了每秒150个请求的速度,但proc的使用情况非常令人失望,如图所示: 只使用了一个内核,这与Node中的设计一致,但我认为如果我可以使用Node.js集群,我可以将每秒的请求数增加近一倍,达到~300,甚至更多。我花了不少时间,但我还没有弄清楚如何将应用程序与我的应用程序一起使用,如下所示:Javascript 如何在simple Express应用程序中使用Node.js群集?,javascript,node.js,redis,express,cluster-computing,Javascript,Node.js,Redis,Express,Cluster Computing,-我构建了一个简单的应用程序,可以从Redis DB中提取数据(50项),并将其上传到localhost。我做了一台ApacheBench(c=100,n=50000),在双核T2080@1.73GHz(我的6 y.o笔记本电脑)上,我得到了每秒150个请求的速度,但proc的使用情况非常令人失望,如图所示: 只使用了一个内核,这与Node中的设计一致,但我认为如果我可以使用Node.js集群,我可以将每秒的请求数增加近一倍,达到~300,甚至更多。我花了不少时间,但我还没有弄清楚如何将应用程
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密集型的,这可能比集群更好)
希望您能提供一些帮助来解决这个问题。实际上,您的工作负载并不是真正的I/O限制:由于基于jade的动态页面生成的成本,它是CPU限制的。我猜不出您的jade模板有多复杂,但即使使用简单的模板,生成HTML页面也很昂贵 对于我的测试,我使用了以下模板:
html(lang="en")
head
title Example
body
h1 Jade - node template engine
#container
ul#users
each user in items
li User:#{user}
我向Redis中的items键添加了100个伪字符串
在我的设备上,node.js CPU为100%时,我得到475个请求/秒(这意味着这个双核设备上的CPU消耗为50%)。让我们替换:
res.render( 'index', { items: items } );
作者:
res.send('ExampleJade-节点模板引擎- 用户:无
用户:无用户:无用户:无用户:无用户:无用户:无用户:无用户:无用户:无用户:无用户:无用户:无用户:无用户:无兴- 用户:无
用户:无用户:无用户:无用户:无用户:无用户:无用户:无用户:无用户:无用户:无用户:无用户:无用户:无用户:没事用户:没事用户:没事用户:没事用户:没事用户:没事用户:没事用户:没事用户:没事用户:没事用户:没事用户:没事用户:没事用户:没事用户:没事用户:没事用户:没事用户- 用户:无
);
现在,基准测试的结果接近2700 req/s。因此,瓶颈显然是由于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 );
}
var cluster=require('cluster'))
if(cluster.isMaster){
对于(var i=0;iwow,谢谢!),这非常有效-imgur.com/Cpqy6-我昨天花了大部分时间将其从80推到150,现在一个简单的if块让所有的工作看起来像花生一样。关于模板的说明非常有教育意义;我知道会有一些成本,但我认为不会是“475到2700”大。我可以优化Express吗?顺便说一句,我也想分享CPU统计数据-imgur.com/n7WPv-我有15个工作线程,但两个内核从未达到100%。我没有启用Redis持久性,所以它不应该触及磁盘,但大约30K的请求标志着我的磁盘旋转疯狂。我忽略了什么吗?性能瓶颈不是Express但是jade。你可以尝试另一个模板引擎(仍在使用express)。下面是一个列表:“性能瓶颈不是express而是jade。”-哎呀,我是说“jade”,但说的是“express”.你认为什么比Jade快?根据我自己的基准,最快的依次是Swig、nTenjin、thunder和doT。你应该尝试NODE\u ENV=production NODE app.js
而不是NODE app.js
。
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 );
}