web-dev-qa-db-fra.com

comment déboguer node.js causant une utilisation à 100% du processeur?

J'ai une application de noeud qui utilise express et redis. Sur notre serveur de développement, après un peu d'utilisation, le nœud commence à utiliser 100% du processeur. L'application répond toujours, mais le nœud supérieur signale 100%. Le processeur ne tombe pas tant que le noeud n'est pas redémarré.

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

Quel est le meilleur moyen de diagnostiquer ce problème? 

J'ai examiné node-inspector avec v8-profiler et cela m'a donné la même erreur que celle signalée ici https://github.com/dannycoates/v8-profiler/issues/10

31
Tim

Vous pouvez profiler votre application avec node-tick .

  1. Installez node-tick par Sudo npm -g install tick
  2. Exécutez votre application avec le profil activé node --prof ./app.js
  3. Après un certain temps d'utilisation du processeur à 100%, arrêtez votre application.
  4. Vous pouvez voir v8.log dans votre répertoire d'applications, vous pouvez maintenant le lire avec node-tick-processor
  5. Exécuter node-tick-processor et expliquer les résultats
  6. Chargez v8.log dans chrome: // traçage pour analyser sous forme d'arborescence.

noeud js cpu 100%

17
laggingreflex

J'ai trouvé le problème en écrivant un script pour enregistrer chaque demande, puis les rejouer. 

Le problème était dû au fait que mon rappel n’était pas renvoyé.

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 code replay.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 votre application express.

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

C’est cool, car chaque élément de l’historique lu est ajouté à la file d’attente. Ainsi, il boucle en boucle et chaque fois que vous visitez une nouvelle page, il ajoute celui-ci à la file.

13
Tim

J'ai également utilisé 100% de l’utilisation du processeur jusqu’à ce que j’ai désactivé le mode superviseur (ce qui a amené le nœud à redémarrer lorsqu'un fichier est modifié).

Cela ne répond probablement pas à cette question, mais au cas où un novice comme moi s’inquiète de l’utilisation du processeur, cela pourrait être le cas.

3
Valentin Heinitz

vous avez peut-être des calculs quelque part en utilisant nextTick qui détruisent constamment le processeur.

Si vous ne pouvez pas exécuter le profil, il est difficile de savoir quelle méthode est la corbeille. Une autre chose à faire est d’examiner le journal express en utilisant le middleware logger http://senchalabs.github.com/connect/middleware-logger.html

1
Jakub Oboza

Si vous utilisez nodemon pour surveiller vos fichiers, pensez à utiliser les chemins d'accès aux dossiers contenant moins de fichiers. par exemple. Laisser nodemon surveiller les dossiers de bibliothèque installés avec bower ou npm entraîne une utilisation intensive du processeur, du fait des milliers de fichiers qu'il contient.

Voici mon exemple de fichier nodemon.json:

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

Fonctionne comme un charme.

0
STREET MONEY

C'est peut-être parce que vous avez des quantités de fichiers en direct. par exemple. node_modules folder . vous devez utiliser le paramètre -i pour ignorer ce dossier. il devrait donc ressembler à ceci: supervisor -i ./node_modules app.

0
user9564965