Trên thực tế, khối lượng công việc của bạn không thực sự bị ràng buộc I / O:nó bị ràng buộc bởi CPU do chi phí tạo trang động dựa trên ngọc bích. Tôi không thể đoán được độ phức tạp của mẫu ngọc bích của bạn, nhưng ngay cả với các mẫu đơn giản, việc tạo các trang HTML rất tốn kém.
Đối với các thử nghiệm của tôi, tôi đã sử dụng mẫu này:
html(lang="en")
head
title Example
body
h1 Jade - node template engine
#container
ul#users
each user in items
li User:#{user}
Tôi đã thêm 100 chuỗi giả vào khóa mục trong Redis.
Trên hộp của tôi, tôi nhận được 475 req / s với CPU node.js ở mức 100% (có nghĩa là mức tiêu thụ CPU 50% trên hộp lõi kép này). Hãy thay thế:
res.render( 'index', { items: items } );
bởi:
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>' );
Bây giờ, kết quả của điểm chuẩn là gần 2700 req / s. Vì vậy, nút cổ chai rõ ràng là do định dạng của trang HTML.
Sử dụng gói cụm trong tình huống này là một ý tưởng hay và nó rất đơn giản. Mã có thể được sửa đổi như sau:
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 );
}
Bây giờ kết quả của điểm chuẩn là gần 750 req / s với mức tiêu thụ CPU 100% (so với 475 req / s ban đầu).