Comment surveiller l'utilisation de la mémoire de Node.js?

114

Comment puis-je surveiller l'utilisation de la mémoire de Node.js?

fsiaonma
la source
4
Un peu plus de détails pourraient être utiles
Wottensprels

Réponses:

66

node-memwatch : détecte et trouve les fuites de mémoire dans le code Node.JS. Consultez ce tutoriel sur le suivi des fuites de mémoire dans Node.js

Damodaran
la source
1
node-memwatch ne semble plus être vivant (dernière mise à jour en mars 2013). Existe-t-il des alternatives?
Golo Roden
6
@GoloRoden npm install memwatch-next fonctionne bien. Voici le repo: github.com/marcominetti/node-memwatch
fre2ak
Une ressource plus à jour pour traquer les fuites de mémoire apmblog.dynatrace.com/2015/11/04/…
saintedlama
22
memwatch n'est plus maintenu et ne fonctionnera pas sur une version récente de node, alors ne vous inquiétez même pas.
Mike
153

Le module de processus intégré a une méthode memoryUsagequi offre un aperçu de l'utilisation de la mémoire du processus Node.js. actuel. Voici un exemple de Node v0.12.2 sur un système 64 bits:

$ node --expose-gc
> process.memoryUsage();  // Initial usage
{ rss: 19853312, heapTotal: 9751808, heapUsed: 4535648 }
> gc();                   // Force a GC for the baseline.
undefined
> process.memoryUsage();  // Baseline memory usage.
{ rss: 22269952, heapTotal: 11803648, heapUsed: 4530208 }
> var a = new Array(1e7); // Allocate memory for 10m items in an array
undefined
> process.memoryUsage();  // Memory after allocating so many items
{ rss: 102535168, heapTotal: 91823104, heapUsed: 85246576 }
> a = null;               // Allow the array to be garbage-collected
null
> gc();                   // Force GC (requires node --expose-gc)
undefined
> process.memoryUsage();  // Memory usage after GC
{ rss: 23293952, heapTotal: 11803648, heapUsed: 4528072 }
> process.memoryUsage();  // Memory usage after idling
{ rss: 23293952, heapTotal: 11803648, heapUsed: 4753376 }

Dans cet exemple simple, vous pouvez voir que l'allocation d'un tableau de 10 millions d'éléments consomme environ 80 Mo (jetez un œil à heapUsed).
Si vous regardez le code source de V8 ( Array::New, Heap::AllocateRawFixedArray, FixedArray::SizeFor), vous verrez que la mémoire utilisée par un tableau est une valeur fixe plus la longueur multipliée par la taille d'un pointeur. Ce dernier est de 8 octets sur un système 64 bits, ce qui confirme qu'une différence de mémoire observée de 8 x 10 = 80 Mo a du sens.

Rob W
la source
1
@MestreSan Quelle version de Node n'a pas besoin --expose-gcpour la gcfonction?
Rob W
1
@MestreSan Je ne ai jamais dit que vous avez besoin --expose-gcpour process.memoryUsage(). gc()(Requérant --expose-gc) a été utilisé dans la réponse pour déclencher de manière déterministe le garbage collection afin de faciliter la visualisation de ce que les process.memoryUsagerapports.
Rob W
C'est une excellente réponse pour mesurer JS-Stuff de la bonne manière. Merci pour cette réponse.
suther
Vous avez fait travailler les seigneurs avec celui-ci. Je viens de réaliser toutes les méthodes exposées en appelant process qui m'aideront à créer une application plus efficace. Merci.
Andrew le
40

Aussi, si vous souhaitez connaître la mémoire globale plutôt que le processus de nœud ':

var os = require('os');

os.freemem();
os.totalmem();

Voir la documentation

Voy
la source
1
Cependant, freemem () n'est pas la même que la mémoire disponible sur le serveur. Un moyen de trouver la mémoire disponible plutôt que libre?
Alex
5

Sous Linux / Unix (note: Mac OS est un Unix) utilisez topet appuyez sur M ( Shift+ M) pour trier les processus par utilisation de la mémoire.

Sous Windows, utilisez le gestionnaire de tâches.

Robin Green
la source
@majidarif Allez sur Applications > Utilitieset vous trouverez une Activity Monitorapplication. Celui-ci est l'équivalent du gestionnaire de tâches. OS X a également la topcommande.
Ingwie Phoenix
3
utiliser htopau lieu de top sur Linux. C'est beaucoup mieux.
Ryan Shillington