- 我构建了一个简单的应用程序,它从Redis数据库中提取数据(50项)并将其抛出到localhost。我做了一个ApacheBench(c = 100,n = 50000),我在双核T2080 @ 1.73GHz(我的6 yo笔记本电脑)上得到了半正常的150请求/秒,但是proc使用非常令人失望图所示:
只使用一个核心,这是根据Node中的设计,但我认为如果我可以使用Node.js群集,我几乎可以将我的请求/秒加倍到~300,甚至更多。我摆弄了不少但我无法弄清楚如何将code given here用于我的应用程序,如下所示:
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密集型的,这会使threads-a-gogo更像是集群的选择)。
想要解决这个问题会有所帮助。
答案 0 :(得分:34)
实际上,您的工作负载并非真正的I / O限制:由于基于玉的动态页面生成的成本,它受CPU限制。我无法猜测你的玉器模板的复杂性,但即使使用简单的模板,生成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个虚拟字符串。
在我的盒子上,我得到475 req / s,node.js CPU为100%(这意味着这个双核盒子的CPU消耗为50%)。让我们替换:
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 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 );
}
现在基准测试的结果接近750 req / s,CPU消耗率为100%(与最初的475 req / s进行比较)。