node.js - home - npm node js
Detectando fugas de memoria en nodejs (7)
¿Hay algunas herramientas para detectar fugas de memoria en nodejs? Y cuénteme sobre su experiencia en probar las aplicaciones de nodejs.
Al rastrear una fuga de memoria intenté con el inspector de nodos anterior.
A partir de abril de 2012, no se actualizó para funcionar con el lanzamiento de nodo contemporáneo 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!
He usado el paquete npm Memwatch:
Eche un vistazo al repositorio de Github y la fuente de NPM
Básicamente, este paquete verifica el uso del montón de memoria justo después de que el motor V8 realiza una recolección de basura y proporciona una línea de base del uso real de la memoria.
Así es como lo usé:
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 de
''stats''
, emitido de vez en cuando, le proporciona los datos que describen su uso de montón y las tendencias en el tiempo.El evento de
''leak''
se emite cuando parece que tu código está perdiendo memoria. Por lo general, se ejecuta cuando el tamaño del montón crece continuamente en un corto período 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 su entorno de escenario para poder seguir los eventos que causan el problema.
La siguiente herramienta debería ser útil para detectar fugas de memoria:
Y también hay un tutorial para ayudarlo a encontrar fugas de memoria aquí:
También podría recomendar las siguientes fuentes:
siguientes episodios de NodeUp, donde se analizan las herramientas de detección de fugas de perfiles y memoria:
Este artículo - Tracking Down Memory Leaks en Node.js - Un Node.JS Holiday Season , que básicamente reúne todos los módulos y técnicas ampliamente conocidos para rastrear las pérdidas de memoria
- 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.
Una cosa buena es https://github.com/bnoordhuis/node-heapdump muy simple y puede ver los resultados en Chrome (debido al mismo motor V8 en el navegador javascript y nodejs) y comparar tamaños de objetos en la memoria en cualquier momento que desee.
Y un consejo más sobre cómo detectar la pérdida de memoria "manualmente" o ayudar a prevenirlo, es forzar al recolector de basura en algunos lugares de su código y ver qué sucede.
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.
Utilizo las herramientas de desarrollo de Chrome y el archivo heapsnapshot directamente, no node-inspector o node-webkit-agent.
require()
el módulo heapdump .
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.
Método 1 -
El nodo nos permite activar manualmente la recolección de basura, y es lo primero que debemos hacer cuando intentamos confirmar una pérdida de memoria. Esto se puede lograr ejecutando Node con la bandera --expose-gc (es decir, node --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 llamando a process.memoryUsage (). HeapUse.
Al activar manualmente la recolección de basura y verificar 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 -
3 Método de volcado de pilas
Node''s --inspect flag aterrizado en el nodo versión 6. Esta función le permite depurar e inspeccionar el proceso de su nodo desde las DevTools de Chrome.
Simplemente inicie la aplicación pasando el indicador --inspect:
$ node --inspect index.js
Siga la URL al inspector y vaya a la pestaña de memoria.
Pestaña de memoria DevTools
Pulse la aplicación con autocannon -c 1 -d 60 http://localhost:PORT
[ https://www.npmjs.com/package/autocannon ]
Tome una instantánea de pila después de aproximadamente 10 segundos, y nuevamente después de 30 segundos.
Comparación de instantáneas de montones
La vista de comparación nos muestra lo que sucedió entre las instantáneas. Puede ver que se ha creado una gran cantidad de objetos o que el GC no los ha recopilado.
Por favor, lea estos increíbles artículos para obtener más información.
Han sido de gran ayuda para encontrar y corregir 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/