48

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

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

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

v8-profiler で node-inspector を調べたところ、ここで報告されているものと同じエラーが表示されました https://github.com/dannycoates/v8-profiler/issues/10

4

9 に答える 9

29

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%

于 2015-02-05T16:25:59.877 に答える
18

すべてのリクエストを記録してから再生するスクリプトを作成することで、問題を発見しました。

返されていないコールバックがあったため、問題が発生しました。

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

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

于 2012-05-17T06:36:36.990 に答える
4

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

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

于 2015-07-25T21:29:35.223 に答える
2

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

ここに私のサンプルnodemon.jsonファイルがあります:

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

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

于 2019-02-16T07:57:41.460 に答える
1

多分あなたはどこかでそれを使っnextTickてCPUを絶えず破壊している計算をしているでしょう。

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

于 2012-04-16T13:21:00.660 に答える