ExpressとRedisを使用するノードアプリがあります。開発サーバーでは、少し使用ノードが100%CPUの使用を開始した後。アプリケーションは引き続き応答しますが、トップは100%を使用してノードを報告します。 CPUは、ノードが再起動されるまでドロップしません。
私はそれを引き起こしている特定のルートや機能に限定していません。
この問題を診断する最良の方法は何ですか?
V8-profilerでノードインスペクターを調べたところ、ここで報告されているのと同じエラーが発生しました https://github.com/dannycoates/v8-profiler/issues/1
node-tick でアプリのプロファイルを作成できます。
node-tick
沿って Sudo npm -g install tick
node --prof ./app.js
node-tick-processor
および結果の説明すべてのリクエストを記録してからリプレイするスクリプトを書くことで問題を見つけました。
この問題は、返されないコールバックがあるために発生しました。
myAsncFunc(function(err, data) {
if (err) { callback(err) }
//node kept going after the error was returned to the user.
// make sure you, return callback(err)
})
興味のある人のためのreplay.jsコードはこちらです。
var request = require('request');
var async = require('async');
var redis = require('redis');
var Host = 'http://myhost.com';
var jobs = true;
var client = redis.createClient();
async.whilst(
function () { return jobs; },
function (callback) {
client.lpop('history', function(err, url) {
console.log(url);
if (!url) {
jobs = false;
callback();
}
request.get({url:Host+url}, function() {
callback();
});
})
},
function (err) {
console.log('done')
}
);
そして、あなたはエクスプレスアプリです。
app.get('/*', function(req, res, next) {
var url = req.originalUrl;
redis.rpush('history', url);
next();
});
クールなのは、再生されるすべての履歴アイテムがキューに再び追加されるため、継続的にループし、新しいページにアクセスするたびにそのアイテムがキューに追加されるためです。
スーパーバイザーモードをオフにするまで100%のCPU使用率も経験しました(ファイルが変更されるとノードが再起動します)。
これはおそらくこの質問には答えませんが、私のような初心者がCPUの使用を心配している場合、これが当てはまる可能性があります。
nextTick
を使用してどこかにCPUを常に破壊している計算があるかもしれません。
プロファイルを実行できない場合、どのメソッドがCPUを破壊しているかを見つけるのは困難です。もう1つは、ロガーミドルウェアを使用してエクスプレスログを調べることです http://senchalabs.github.com/connect/middleware-logger.html
nodemon
を使用してファイルを監視している場合は、ファイルの少ないフォルダーへのパスの使用を検討してください。例えばbowerまたはnpmでインストールされたライブラリフォルダーをnodemon
監視すると、そこに含まれる数千のファイルのためにCPU使用率が高くなります。
これが私のサンプルですnodemon.json
ファイル:
{
"watch": ["views","routes"],
"ext": "html, js"
}
魅力のように機能します。
それは多分あなたが直接のファイルの量だからです。例えばnode_modulesフォルダー。そのフォルダーを無視するには、-i paramを使用する必要があります。したがって、次のようになります。supervisor -i ./node_modules app
。