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


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


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.


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


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.


@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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.