Come monitorare l'utilizzo della memoria di Node.js?


Risposte:


66

node-memwatch : rileva e trova perdite di memoria nel codice Node.JS. Controlla questo tutorial Tracking Down Memory Leaks in Node.js


1
node-memwatch sembra non essere più vivo (ultimo aggiornamento marzo 2013). Esistono alternative?
— Golo Roden

6
@GoloRoden npm install memwatch-next funziona bene. Ecco il repo: github.com/marcominetti/node-memwatch
— fre2ak

Una risorsa più aggiornata per la ricerca di perdite di memoria apmblog.dynatrace.com/2015/11/04/…
— saintedlama

22
memwatch non viene più mantenuto e non funzionerà su una versione recente di node, quindi non preoccuparti nemmeno.
— Mike


153

Il modulo di processo integrato ha un metodo memoryUsageche offre informazioni sull'utilizzo della memoria dell'attuale processo Node.js. Ecco un esempio tratto da Node v0.12.2 su un sistema a 64 bit:

$ 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 }

In questo semplice esempio, puoi vedere che l'allocazione di un array di 10 milioni di elementi consuma circa 80 MB (dai un'occhiata heapUsed).
Se si guarda il codice sorgente di V8 ( Array::New, Heap::AllocateRawFixedArray, FixedArray::SizeFor), allora vedrai che la memoria utilizzata da un array è un valore fisso più la lunghezza moltiplicata per la dimensione di un puntatore. Quest'ultimo è di 8 byte su un sistema a 64 bit, il che conferma che la differenza di memoria osservata di 8 x 10 = 80 MB ha senso.


1
@MestreSan Quale versione di Node non necessita --expose-gcdella gcfunzione?
— Rob W

1
@MestreSan Non ho mai detto che è necessario --expose-gcper process.memoryUsage(). gc()(require --expose-gc) è stato utilizzato nella risposta per attivare in modo deterministico la garbage collection per rendere più facile vedere cosa process.memoryUsageriporta.
— Rob W

Questa è una risposta fantastica per misurare JS-Stuff nel modo giusto. Grazie per la risposta.
— suther

Hai fatto lavorare i Lord con questo. Ho appena realizzato tutti i metodi esposti chiamando il processo che mi aiuteranno a creare un'applicazione più efficiente. Grazie.
— Andrew

40

Inoltre, se desideri conoscere la memoria globale piuttosto che il processo del nodo ":

var os = require('os');

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

Vedere la documentazione


1
Tuttavia, freemem () non è la stessa della memoria disponibile sul server. Qualche modo per trovare memoria disponibile piuttosto che libera?
— Alex


5

Su Linux / Unix (nota: Mac OS è un Unix) usa tope premi M ( Shift+ M) per ordinare i processi in base all'utilizzo della memoria.

Su Windows usa il Task Manager.


@majidarif Vai a Applications > Utilitiese troverai Activity Monitorun'app. Quello è l'equivalente di Task Manager. Anche OS X ha il topcomando.
— Ingwie Phoenix

3
utilizzare htopinvece di top su Linux. È molto meglio.
— Ryan Shillington
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.