web-dev-qa-db-ja.com

node.jsをデバッグしてCPU使用率を100%にする方法

ExpressとRedisを使用するノードアプリがあります。開発サーバーでは、少し使用ノードが100%CPUの使用を開始した後。アプリケーションは引き続き応答しますが、トップは100%を使用してノードを報告します。 CPUは、ノードが再起動されるまでドロップしません。

私はそれを引き起こしている特定のルートや機能に限定していません。

この問題を診断する最良の方法は何ですか?

V8-profilerでノードインスペクターを調べたところ、ここで報告されているのと同じエラーが発生しました https://github.com/dannycoates/v8-profiler/issues/1

34
Tim

node-tick でアプリのプロファイルを作成できます。

  1. インストールnode-tick 沿って Sudo npm -g install tick
  2. プロファイルを有効にしてアプリを実行node --prof ./app.js
  3. CPU使用率が100%になった後、アプリを停止します
  4. アプリディレクトリでv8.logを確認できます。node-tick-processorで読み取ることができます。
  5. 実行node-tick-processorおよび結果の説明
  6. V8.logをchrome:// tracingにロードして、ツリーとして分析します。

ノードjs cpu 100%

20
laggingreflex

すべてのリクエストを記録してからリプレイするスクリプトを書くことで問題を見つけました。

この問題は、返されないコールバックがあるために発生しました。

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();
});

クールなのは、再生されるすべての履歴アイテムがキューに再び追加されるため、継続的にループし、新しいページにアクセスするたびにそのアイテムがキューに追加されるためです。

16
Tim

スーパーバイザーモードをオフにするまで100%のCPU使用率も経験しました(ファイルが変更されるとノードが再起動します)。

これはおそらくこの質問には答えませんが、私のような初心者がCPUの使用を心配している場合、これが当てはまる可能性があります。

3

nextTickを使用してどこかにCPUを常に破壊している計算があるかもしれません。

プロファイルを実行できない場合、どのメソッドがCPUを破壊しているかを見つけるのは困難です。もう1つは、ロガーミドルウェアを使用してエクスプレスログを調べることです http://senchalabs.github.com/connect/middleware-logger.html

1
Jakub Oboza

nodemonを使用してファイルを監視している場合は、ファイルの少ないフォルダーへのパスの使用を検討してください。例えばbowerまたはnpmでインストールされたライブラリフォルダーをnodemon監視すると、そこに含まれる数千のファイルのためにCPU使用率が高くなります。

これが私のサンプルですnodemon.jsonファイル:

{
    "watch": ["views","routes"],
    "ext": "html, js"
}

魅力のように機能します。

0
STREET MONEY

それは多分あなたが直接のファイルの量だからです。例えばnode_modulesフォルダー。そのフォルダーを無視するには、-i paramを使用する必要があります。したがって、次のようになります。supervisor -i ./node_modules app

0
user9564965