comment déboguer nœud.js provoquant une utilisation 100% cpu?

j'ai une application de noeud qui utilise express et redis. Sur notre serveur de développement, après un peu d'utilisation node commence à utiliser 100% cpu. L'application répond toujours mais le noeud de rapports top utilise 100%. Le processeur ne tombe pas tant que le noeud n'est pas redémarré.

Je ne l'ai pas cloué à une route ou une fonction particulière qui en est la cause.

Quelle est la meilleure façon de diagnostiquer ce problème?

j'ai regardé noeud-inspecteur avec le V8-profiler et il m'a donné la même erreur qui est rapporté ici https://github.com/dannycoates/v8-profiler/issues/10

31
demandé sur Tim 2012-04-16 04:41:26

5 réponses

vous pouvez profiler votre application avec noeud-tick .

  1. Installer node-tick par sudo npm -g install tick
  2. lancez votre application avec le profil activé node --prof ./app.js
  3. après un certain temps avec CPU 100% d'utilisation arrêter votre application
  4. vous pouvez voir v8.connectez-vous à votre répertoire app, maintenant vous pouvez le lire avec nœud-tique-processeur
  5. exécuter node-tick-processor et expliquer les résultats
  6. Charger v8.connectez-vous à chrome://tracing pour analyser sous forme d'arbre.

node JS cpu 100%

17
répondu laggingreflex 2017-05-23 11:54:50

j'ai trouvé le problème en écrivant un script pour enregistrer chaque demande et relire eux.

le problème a été causé parce que j'ai eu un rappel qui n'était pas retourné.

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)

})

Voici mon replay.code js pour toute personne intéressée.

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

et dans l'application you're express.

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

c'est cool parce que chaque élément d'histoire qui est joué sera ajouté à nouveau à la file d'attente ainsi il passe en boucle et à chaque fois que vous visitez une nouvelle page, il va ajouter à la file d'attente.

12
répondu Tim 2012-05-17 06:36:36

j'ai également connu une utilisation CPU à 100% jusqu'à ce que j'éteigne le mode superviseur (provoquant le redémarrage du noeud, quand un fichier change).

cela ne répond probablement pas à cette question, mais dans le cas où un novice comme moi s'inquiète de L'utilisation du CPU, cela pourrait être le cas.

2
répondu Valentin Heinitz 2015-07-25 21:29:35

peut-être que vous avez un calcul quelque part en utilisant nextTick qui détruit CPU constamment.

si vous ne pouvez pas exécuter profile alors il est difficile de savoir quelle méthode est en train de détruire cpu. Une autre chose est d'examiner express log en utilisant logger middleware http://senchalabs.github.com/connect/middleware-logger.html

1
répondu Jakub Oboza 2012-04-16 13:21:00

peut-être parce que vous êtes des quantités de fichiers dans le direct. par exemple, dossier node_modules. vous devez utiliser le-i param pour ignorer ce dossier. donc, il devrait juste comme ça: supervisor -i ./node_modules app .

0
répondu user9564965 2018-03-28 15:16:48