वास्तव में, आपका कार्यभार वास्तव में 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}
मैंने रेडिस में आइटम कुंजी में 100 डमी स्ट्रिंग्स जोड़े।
मेरे बॉक्स पर, मुझे 100% पर node.js CPU के साथ 475 req/s मिलता है (जिसका अर्थ है कि इस दोहरे कोर बॉक्स पर 50% CPU खपत)। आइए बदलें:
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 );
}
अब बेंचमार्क का परिणाम 100% CPU खपत के साथ 750 req/s के करीब है (शुरुआती 475 req/s के साथ तुलना करने के लिए)।