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.