¿Cómo monitorear el uso de memoria de Node.js?

114

¿Cómo puedo monitorear el uso de memoria de Node.js?

fsiaonma
fuente
4
Un poco más de detalles podrían ser útiles
Wottensprels

Respuestas:

66

node-memwatch : detecta y encuentra fugas de memoria en el código Node.JS. Consulte este tutorial Seguimiento de pérdidas de memoria en Node.js

Damodaran
fuente
1
Nodo-memwatch parece no estar vivo más (actualizado por última vez en marzo de 2013). ¿Existen alternativas?
Golo Roden
6
@GoloRoden npm install memwatch-next funciona bien. Aquí está el repositorio: github.com/marcominetti/node-memwatch
fre2ak
Un recurso más actualizado para buscar fugas de memoria apmblog.dynatrace.com/2015/11/04/…
saintedlama
22
memwatch ya no se mantiene y no funcionará en una versión reciente del nodo, así que ni siquiera se moleste.
Mike
153

El módulo de proceso integrado tiene un método memoryUsageque ofrece información sobre el uso de memoria del proceso actual de Node.js. Aquí hay un ejemplo de Node v0.12.2 en un sistema de 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 }

En este ejemplo simple, puede ver que la asignación de una matriz de 10 millones de elementos consume aproximadamente 80 MB (eche un vistazo heapUsed).
Si nos fijamos en el código fuente de V8 ( Array::New, Heap::AllocateRawFixedArray, FixedArray::SizeFor), entonces se verá que la memoria utilizada por un array es un valor fijo más la longitud multiplicada por el tamaño de un puntero. Este último es de 8 bytes en un sistema de 64 bits, lo que confirma que la diferencia de memoria observada de 8 x 10 = 80 MB tiene sentido.

Rob W
fuente
1
@MestreSan ¿Qué versión de Node no necesita --expose-gcpara la gcfunción?
Rob W
1
@MestreSan nunca he dicho que es necesario --expose-gcpara process.memoryUsage(). gc()(require --expose-gc) se usó en la respuesta para activar de manera determinista la recolección de basura para que sea más fácil ver lo que process.memoryUsageinforman.
Rob W
Esa es una respuesta increíble para medir JS-Stuff de la manera correcta. Gracias por esa respuesta.
Suther
Hiciste el trabajo de los señores con este. Me acabo de dar cuenta de todos los métodos expuestos al llamar al proceso que me ayudarán a crear una aplicación más eficiente. Gracias.
Andrew
40

Además, si desea conocer la memoria global en lugar del proceso de nodo ':

var os = require('os');

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

Ver documentación

Voy
fuente
1
Sin embargo, freemem () no es lo mismo que la memoria disponible en el servidor. ¿Alguna forma de encontrar memoria disponible en lugar de libre?
Alex
5

En Linux / Unix (nota: Mac OS es un Unix) use topy presione M (Shift + M) para ordenar los procesos por uso de memoria.

En Windows, use el Administrador de tareas.

Robin Green
fuente
@majidarif Vaya a Applications > Utilitiesy encontrará una Activity Monitoraplicación. Ese es el equivalente al Administrador de tareas. OS X también tiene el topcomando.
Ingwie Phoenix
3
usar en htoplugar de top en Linux. Es mucho mejor.
Ryan Shillington