2012-05-14 29 views
30

¿Existen algunas herramientas para detectar fugas de memoria en nodejs? Y cuénteme sobre su experiencia en probar las aplicaciones de nodejs.Detección de fugas de memoria en nodejs

+2

que leen este blog y me parece útil, http: // dtrace. org/blogs/bmc/2012/05/05/debugging-node-js-memory-leaks/ – tawfekov

Respuesta

10

en la búsqueda de una pérdida de memoria Probé el nodo-inspector anterior.
A partir de abril de 2012 no se actualizó para funcionar con la versión de nodo contemporánea v0.6.12 Como tal encontré: https://github.com/c4milo/node-webkit-agent.
Pudo mostrar instantáneas de montón para el motor V8 más nuevo que no era compatible con el inspector de nodos. En poco tiempo, pude detectar el módulo de fuga (en este caso, loggly), ¡espero que tenga un éxito similar!

+2

Esto funciona bastante bien. Lo usé para el nodo v0.8.x también –

+1

+1 para node-inspector está roto. – liuyanghejerry

6

También podría recomendar siguientes fuentes:

  1. siguientes episodios de NodeUp, donde perfilado y pérdidas de memoria se discuten las herramientas de detección:

  2. Este ar ticle - Tracking Down Memory Leaks in Node.js – A Node.JS Holiday Season, que básicamente agrega todos los módulos y técnicas ampliamente conocidos para rastrear fugas de memoria

  3. Para Mac OS, la herramienta Instruments podría ser útil para depurar módulos nativos (C++). No es tan sofisticado como las herramientas de SmartOS, pero es muy fácil de configurar.
2

Utilizo las herramientas de desarrollo de Chrome y el archivo heapsnapshot directamente, no el nodo-inspector o el nodo-webkit-agent.

require()heapdump módulo.

Envíe la señal de usr2 al proceso nodejs en ejecución para obtener el archivo heapsnapshot.

Cargue el archivo heapsnapshot en la pestaña de perfiles de las herramientas de desarrollo de Chrome.

0

Una cosa buena es https://github.com/bnoordhuis/node-heapdump muy simple y se puede ver los resultados en Chrome (debido mismo motor V8 en el navegador javascript y nodejs) y comparar los tamaños de objetos en memoria en cada momento que desee.

Y un consejo más sobre cómo detectar la pérdida de memoria "manualmente" o ayudar a prevenirlo, es forzar el recolector de basura en algunos lugares de su código y ver qué pasa.

Inicie su aplicación con "node --expose-gc file.js" y en cualquier parte del código puede usar la función gc(); para llamar a la recolección de basura.

1

he utilizado el paquete NPM Memwatch:

echar un vistazo para el Github repository y la NPM source

Básicamente este paquete comprueba el uso del montón de memoria justo después de una recolección de basura se lleva a cabo por el motor V8, y le dará una línea de base del uso real de la memoria.

Así es como lo utilicé:

var memwatch = require('memwatch'); 

memwatch.on('leak', function(info) { 
    console.log('Memwatch leak: '); 
    console.log(info); 
}); 

memwatch.on('stats', function(stats) { 
    console.log.message('Memwatch stats: '); 
    console.log(stats); 
}); 

De la documentación original:

El evento 'stats', emitida en ocasiones, se dan los datos que describen el uso del montón y las tendencias en el tiempo.

El evento 'leak' se emite cuando parece que su código tiene una fuga de memoria. Por lo general, se ejecuta cuando el tamaño del almacenamiento dinámico crece continuamente en en un período corto de tiempo.

Memwatch también proporciona una clase "HeapDiff" para calcular el estado del montón entre dos instantáneas que puede tomar en sus funciones.

Puede ser una buena idea ejecutar memwatch en el entorno de su escenario, con el fin de rastrear los eventos que causan el problema.

+1

memwatch ya está muerto – mateeyow

+0

Necesita 'memwatch-next' y admite las mismas llamadas. –

1

Método 1 -
Nodo nos permite activar manualmente recolección de basura, y es lo primero que hay que hacer cuando se trata confirmar una pérdida de memoria. Esto se puede lograr ejecutando Node con el indicador --expose-gc (es decir, nodo --expose-gc index.js). Una vez que el nodo se está ejecutando en ese modo, puede activar mediante programación una recolección de basura en cualquier momento llamando a global.gc() desde su programa.

También puede verificar la cantidad de memoria utilizada por su proceso al llamar a process.memoryUsage(). HeapUsed.

Activando manualmente la recolección de elementos no utilizados y comprobando el montón utilizado, puede determinar si, de hecho, está observando una pérdida de memoria en su programa. El crecimiento de la memoria se vuelve aún más evidente a medida que realiza esta prueba.

Método 2 - Bandera --inspect

3 Montón volcados Método

de Nodos aterrizó en la versión nodo 6. Esta característica le permite depurar e inspeccionar su proceso de nodo desde dentro DevTools de Chrome.

Simplemente inicie la aplicación pasando la opción --inspect:

$ node --inspect index.js

Siga el URL para el inspector y vaya a la pestaña de memoria.

DevTools memoria Tab

enter image description here Esto es lo que haremos:

golpear la aplicación con cañón automático -c -d 1 60 http://localhost:PORT
[https://www.npmjs.com/package/autocannon]
tomar una instantánea montón después de aproximadamente 10 segundos y nuevamente después de 30 segundos.

Comparación de instantáneas de montículo
La vista de comparación nos muestra lo que ha sucedido entre las instantáneas. Puede ver que se ha creado una gran cantidad de objetos o que el GC no los ha recopilado.

Lea estos artículos increíbles para obtener más información.
Han sido de gran ayuda para encontrar & arreglar una fuga: -

https://www.alexkras.com/simple-guide-to-finding-a-javascript-memory-leak-in-node-js/

https://www.nearform.com/blog/self-detect-memory-leak-node/

https://addyosmani.com/blog/taming-the-unicorn-easing-javascript-memory-profiling-in-devtools/