NodeJs を使用してリアルタイム統計アプリケーションを構築しています。プロトタイプの場合、クラスター NodeJs ( http://learnboost.github.com/cluster/ ) とネイティブ nodejs ドライバーを使用する MongoDb を使用するnodejs サーバーでのテストのために、RackSpace サーバーでクアッドコア AMD Opteron を使用しています。.
基本的に、クライアントの Web サイトにコンテンツを配信する JS コードを会社のプロジェクトに挿入しました。このコードは、10 秒ごとにサーバーに "ping" を実行し、画像を呼び出し、サーバー側で取得して MongoDb コレクションに挿入 (または更新) するパラメーターを渡します。1日の「遅い」時間帯に、約3000の接続を取得します(ターミナルでnetstat -natpコマンドを使用してこれらを取得します)。これにより、クラスターが各コアの約25%を使用します(「top」コマンドを使用してこれらを取得します)。しかし、「忙しい」時間には、クラスターが狂うたびに約7000以上の接続が発生し(各コアの約80%以上の使用)、時間が経つにつれてノードが劣化するようです。これは正常ですか?それとも、Nodejs はこれらのヒットをより「簡単な」方法で処理する必要がありますか? Mongoose を使用すると、パフォーマンスが向上しますか?
MongoDb に興味がある場合は、1 つのコアの約 4% を使用しますが、これは私にとっては問題ありません (インデックスを配置しない場合、使用率は約 50% 以上でしたが、少なくとも、インデックスはこのパフォーマンスの問題を解決しました)。
辛抱強くありがとう、乾杯。
編集:
挿入を行うコードは次のようになります: db.open(function(err, db) { });
return connect.router(function(app){
app.get("/pingserver/:clientid/:event/:cachecontrol", function(req, res, next){
event:'+req.params.event + ', cachecontrol:' + req.params.cachecontrol);
var timestamp = new Date();
switch(req.params.event) {
case 'load':
var params = url.parse(req.url, true).query;
db.collection('clientsessions', function(err, collection) {
try {
var client = {
id: req.params.clientid,
state: req.params.event + 'ed',
loadTime: timestamp.getTime(),
lastEvent: req.params.event,
lastEventTime: timestamp.getTime(),
lastEventDate: timestamp.toString(),
events: [{
event: req.params.event,
timestamp: timestamp.getTime(),
date: timestamp.toString()
}],
media: {
id: params.media.split('|')[0] || null,
title: unescape(params.media.split('|')[1]) || null
},
project: {
id: params.project.split('|')[0] || null,
name: unescape(params.project.split('|')[1]) || null
},
origin: req.headers['referer'] || req.headers['referrer'] || '',
userAgent: req.headers['user-agent'] || null,
userIp: req.socket && (req.socket.remoteAddress || (req.socket.socket && req.socket.socket.remoteAddress)),
returningUser: false
};
}catch(e) {console.log(e);}
collection.insert(client, function(err, doc) {
});
});
break;
case 'ping':
db.collection('clientsessions', function(err, collection) {
collection.update({id: req.params.clientid}, {
$set : { lastEvent: req.params.event
,lastEventTime: timestamp.getTime(),lastEventDate: timestamp.toString()}
}, {}, function(err, doc) {});
});
break;
default:
db.collection('clientsessions', function(err, collection) {
collection.update({id: req.params.clientid}, {
$set : {state: req.params.event+'ed'
, lastEvent: req.params.event
, lastEventTime: timestamp.getTime()}
, $push : { events : { event: req.params.event, timestamp: timestamp.getTime(), date: timestamp.toString() } } }, {}, function(err, doc) {});
});
break;
}
if (!transparent) {
console.log('!transparent');
transparent = fs.readFileSync(__dirname + '/../../public/images/transparent.gif', 'binary');
}
res.setHeader('Content-Type', 'image/gif');
res.setHeader('Content-Length', transparent.length);
res.end(transparent, 'binary');
});
});