webentwicklung-frage-antwort-db.com.de

wie debuggen Sie node.js, wodurch die CPU-Auslastung 100% beträgt?

Ich habe eine Knoten-App, die Express und Redis verwendet. Auf unserem Entwicklungsserver beginnt der Knoten nach einiger Zeit mit 100% CPU. Die Anwendung antwortet immer noch, aber der Knoten mit den höchsten Berichten verwendet 100%. Die CPU fällt nicht ab, bis der Knoten neu gestartet wird.

Ich habe es nicht auf eine bestimmte Route oder Funktion festgelegt, die es verursacht. 

Wie lässt sich dieses Problem am besten diagnostizieren? 

Ich habe mir Node-Inspector mit dem V8-Profiler angesehen und er hat mir den gleichen Fehler gemeldet, der hier gemeldet wird https://github.com/dannycoates/v8-profiler/issues/10

31
Tim

Sie können Ihre App mit node-tick profilieren.

  1. Installieren Sie node-tick durch Sudo npm -g install tick
  2. Führen Sie Ihre App mit aktiviertem Profil aus node --prof ./app.js
  3. Nach einiger Zeit mit 100% CPU-Nutzung beenden Sie Ihre App
  4. Sie können v8.log in Ihrem App-Verzeichnis sehen. Nun können Sie es mit dem Node-Tick-Prozessor lesen
  5. Führen Sie node-tick-processor aus und erläutern Sie die Ergebnisse
  6. Laden Sie v8.log in chrome: // Tracing, um den Baum zu analysieren.

Knoten Js CPU 100%

17
laggingreflex

Ich fand das Problem, indem ich ein Skript schrieb, um jede Anfrage aufzuzeichnen und sie dann wiederzugeben. 

Das Problem wurde verursacht, weil ich einen Rückruf hatte, der nicht zurückgegeben wurde.

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)

})

Hier war mein replay.js-Code für alle Interessierten. 

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

Und in Ihrer Express-App.

app.get('/*', function(req, res, next) {
    var url = req.originalUrl;
    redis.rpush('history', url);   
    next();
});

Das ist cool, da jedes gespielte Verlaufselement erneut der Warteschlange hinzugefügt wird, so dass es fortlaufend in einer Schleife abgespielt wird. Jedes Mal, wenn Sie eine neue Seite besuchen, wird dieses der Warteschlange hinzugefügt.

13
Tim

Ich hatte auch eine 100% ige CPU-Auslastung, bis ich den Supervisor-Modus abschaltete (wodurch der Knoten neu gestartet wird, wenn sich eine Datei ändert).

Dies beantwortet diese Frage wahrscheinlich nicht, aber wenn ein Neuling wie ich sich Sorgen über die CPU-Auslastung macht, könnte dies der Fall sein.

3

vielleicht haben Sie irgendwo Berechnungen mit nextTick, die die CPU ständig in den Papierkorb werfen.

Wenn Sie das Profil nicht ausführen können, ist es schwer herauszufinden, welche Methode die CPU ausnutzt. Eine weitere Sache ist die Überprüfung des Express-Logs mit der Logger-Middleware http://senchalabs.github.com/connect/middleware-logger.html

1
Jakub Oboza

Wenn Sie nodemon zum Überwachen Ihrer Dateien verwenden, sollten Sie Pfade zu Ordnern mit weniger Dateien in Betracht ziehen. z.B. Wenn nodemon Watch Library-Ordner mit Bower oder Npm installiert wird, führt dies zu einer hohen CPU-Auslastung, da Tausende von darin enthaltenen Dateien vorhanden sind.

Hier ist meine Beispieldatei nodemon.json:

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

Funktioniert wie Charme.

0
STREET MONEY

Vielleicht liegt es daran, dass Sie Mengen von Dateien direkt ablegen. z.B. node_modules ordner . Sie müssen den Parameter -i verwenden, um diesen Ordner zu ignorieren. es sollte also einfach so aussehen: supervisor -i ./node_modules app.

0
user9564965