Debugging: Depuración y creación de perfiles de fugas

debugging

Depuración y creación de perfiles de fugas de memoria en NodeJS con Chrome

Debugging — Recientemente, mientras monitoreábamos los microservicios en Producción, notamos que algunos de nuestros servicios escritos en NodeJS se reiniciaban cada semana. Al investigar los registros, todos tenían el mismo tipo de error.


 

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed — JavaScript heap out of memory

 

¡Definitivamente no es algo que quieras ver en un fin de semana! Uf, fuimos salvados porque los servicios estaban en piloto automático y se reiniciaban cada vez que ocurría este problema.

No obstante, tomamos la pastilla roja y decidimos bajar por la madriguera del conejo.

Las líneas inmediatas que siguen al error no suelen tener suficiente información sobre su causa. Podría ser una variable global, una función infinita o un paquete npm defectuoso. Sin depurar el código, no se puede derivar una conclusión con solo mirar los registros.

Modo debugging:

En primer lugar, debemos iniciar nuestra aplicación en modo de debugging. Recomiendo usar el depurador de código de Visual Studio. Si es nuevo en él, siga las instrucciones aquí, aunque para Node es bastante sencillo cualquiera que sea el marco (Express / NestJS ..)

debugging

O puede ejecutar el cmd,

node --inspect-brk <your path to main js file>

Su aplicación ahora debería iniciarse en modo de depuración.

debugging

Chrome:

Enciende el navegador Chrome. Presione F12 para que aparezcan las herramientas de desarrollo. Ahora debería ver un icono verde de nodejs a la izquierda. (tarda unos segundos en aparecer)

Ábralo y su proceso aparecerá en la pestaña de conexiones en el mismo puerto que está ejecutando su depurador.

Para verificar, su aplicación también mostrará el depurador adjunto

debugging

Tomando instantáneas de la memoria:

Seleccione la pestaña de memoria y el tipo de perfil. La instantánea del montón es una buena opción para comenzar y también es la opción predeterminada. Haga clic en tomar instantánea en la parte inferior.

Lo que va a hacer es tomar un volcado de memoria de su aplicación de nodo y crear un archivo de instantánea completo con detalles sobre la asignación de objetos, la memoria utilizada y otras cosas. Se recomienda tomar varias instantáneas durante un período de tiempo, por ejemplo, cada 10 minutos o 30 minutos, dependiendo de qué tan rápido su aplicación esté encontrando el error de pila sin memoria.

debugging

Interpretación del resultado de la instantánea:

A primera vista, puede parecer complejo y tener demasiada información en la pantalla. Pero no se preocupe, le daremos sentido en un minuto.

Estructura – la columna del constructor detalla todos los objetos / funciones / contexto inicializados, mientras que la columna de tamaño retenido muestra la cantidad de memoria que ocupan esos. Ordenarlos por tamaño retenido le permitirá ver qué objetos ocupan la mayor parte de su memoria. Para inspeccionar más, puede expandir los objetos en la columna del constructor y averiguar qué paquetes o parte del código lo está haciendo.

debugging

Comparación – Quizás la opción más interesante es el “objeto asignado entre instantáneas” disponible en la primera instantánea seleccionada. Esto comparará dos instantáneas diferentes y le dirá exactamente qué objetos se crearon entre ellas. A menudo, el código que causa el problema aparecerá en estas comparaciones. Un indicador fácil es el mismo tipo de clase / función de objeto.

debugging

Estadísticas – seleccione la opción de estadísticas de la columna superior y mostrará cuánta memoria ocupan las diferentes partes de su código en una vista de gráfico circular. Esta es una forma rápida de visualizar la asignación general entre objetos.


Tomando el perfil de la CPU:

Otra opción para perfilar es el uso de la CPU. Es un indicador adicional para verificar si hay alguna función de larga duración. Vaya a la pestaña del generador de perfiles y presione el botón de grabación. Una vez hecho esto, el perfil se parece a esto,

Las cosas a tener en cuenta aquí son las duraciones y funciones ejecutadas.

Adicional: use esta extensión en el código de Visual Studio para obtener una vista en vivo del gráfico cpu vs heap.

Bueno, al combinar la creación de perfiles de memoria y de CPU, debería tener una idea bastante clara de lo que provocó la falta de memoria en el montón. Espero que este artículo sobre debugging ayude.

¡Gracias por leer!

Recent Post