2016-04-08 2 views
0

J'ai une application faite avec Node.js + Express 3 + Jade qui utilisent MySQL DB et le module node-mysql.Node.js hight utilisation du processeur, comment le déboguer?

L'application est démarrée et surveillée par PM2.

Lorsque la page principale est chargée, je constate une très forte utilisation de la CPU, comme dans l'image suivante.

usage of CPU of App Node.js

La page de démarrage effectue trois requêtes sur une base de données MySQL, mais aussi si je mets Json objets au lieu de requêtes MySQL, il semble l'utilisation du processeur est encore trop élevé.

Il existe un moyen de suivre l'utilisation du processeur dans la fonction de point de terminaison pour comprendre la raison de l'utilisation élevée de la CPU?

+0

« page principale est chargée, je vois une très forte utilisation du CPU » - do vous voulez dire que vous voyez toujours une utilisation élevée lorsque l'application est en cours d'exécution, vous ne voyez que lorsque la page principale est chargée, ou vous ne voyez que sur le premier chargement de la page principale? –

+0

Cette application a seulement deux pages. La page de démarrage est une sorte de configurateur; elle lance donc des requêtes au démarrage et d'autres requêtes sont effectuées via les services de repos AJAX. La deuxième page (la plus importante) a beaucoup de requêtes au début et dans ce cas l'utilisation du CPU était de 80/100%. L'application stocke certaines données en session et les autres opérations effectuées dans cette page (via les services REST) ​​ont une utilisation CPU très faible. Donc, je pense que les requêtes MySQL pourraient être le problème, mais j'ai besoin d'un moyen de le vérifier, et peut-être de le résoudre. – Zauker

Répondre

2

Je résolu mon problème de profilage CPU grâce.

J'ai essayé de consigner l'utilisation du processeur dans plusieurs parties de ma fonction de point de terminaison, mais cette approche n'a pas été utile. Pour tous ceux qui ont besoin d'obtenir l'utilisation du processeur ce script, il est très bon: http://gist.github.com/bag-man/5570809

Pour exclure que la question était liée aux requêtes MySQL je crée une application simple qui a effectué des requêtes seulement et je l'ai testé avec ApacheBench. Ce test a réussi.

Après cela, j'ai trouvé la solution.

profiler pour Node.js il est expliqué ici: https://nodejs.org/en/docs/guides/simple-profiling/

j'ai couru l'application avec construit dans profileur:

NODE_ENV=development node --prof app.js 

J'ai fait quelques demandes par ApacheBench

ab -k -c 20 -n 250 "http://localhost:8080/" 

J'ai généré un fichier processing.txt

node --prof-process isolate-0xnnnnnnnnnnnn-v8.log > processed.txt 

Dans le résumé, j'obtenu que:

[Summary]: 
    ticks total nonlib name 
    4036 22.6% 23.3% JavaScript 
    13130 73.6% 75.9% C++ 
    1334 7.5% 7.7% GC 
    527 3.0%   Shared libraries 
    144 0.8%   Unaccounted 

Le "Bottom up (lourd) profil" était tout lié au Module enlaidir-js:

/node_modules/with/node_modules/uglify-js/lib/parse.js 

Ainsi, la recherche de la dépendances J'ai vu que ce module est utilisé par Jade.

Mon application a effectué beaucoup de requêtes et généré un objet Json de grande taille qui a été transmis au moteur de modèle Jade.

Le Jade utilisait beaucoup de CPU pour analyser le grand objet transmis.

Comme d'abord j'ai fait une mise à jour de ce module de 0.35.0 à 1.3.1 (parce que carg est toujours en alpha). Jade a utilisé beaucoup de CPU pour analyser le grand objet transmis.

Comme d'abord j'ai fait une mise à jour de ce module de 0.35.0 à 1.3.1 (parce que carg est toujours en alpha).

Grâce à cette mise à jour, les performances ont augmenté.

Mais finalement je prévois de charger la page sans requêtes lourdes et obtenir les informations nécessaires par un service REST, sans transmettre des données à Jade

1

Vous pouvez utiliser le module os pour connecter l'utilisation du processeur de la machine

var os = require('os'); 
console.log(os.cpus()); 
+0

Oui, j'ai vu cette fonction, mais j'ai besoin de connaître le pourcentage de CPU utilisé. J'ai trouvé cette solution, que cela semble bon. https://gist.github.com/bag-man/5570809 – Zauker