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
Sie können Ihre App mit node-tick profilieren.
node-tick
durch Sudo npm -g install tick
node --prof ./app.js
node-tick-processor
aus und erläutern Sie die ErgebnisseIch 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.
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.
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
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.
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
.