Вопрос по node.js – Обнаружение утечек памяти в nodejs

33

Есть ли инструменты для обнаружения утечек памяти в nodejs? И расскажите мне о своем опыте тестирования приложений nodejs.

Я читаю этот блог и считаю его полезным,dtrace.org/blogs/bmc/2012/05/05/debugging-node-js-memory-leaks tawfekov

Ваш Ответ

7   ответов
1

Method 1 -
Узел позволяет нам запускать сборку мусора вручную, и это первое, что мы должны сделать при попытке подтвердить утечку памяти. Это можно сделать, запустив Node с флагом --expose-gc (т.е. узел --expose-gc index.js). Когда узел работает в этом режиме, вы можете в любой момент программно запустить сборку мусора, вызвав global.gc () из вашей программы.

Вы также можете проверить объем памяти, используемой вашим процессом, вызвав process.memoryUsage (). HeapUsed.

Путем ручного запуска сборки мусора и проверки используемой кучи вы можете определить, действительно ли вы наблюдаете утечку памяти в вашей программе. Рост памяти становится еще более очевидным, когда вы делаете этот тест.

Method 2 -

Метод 3 свалок

Флаг узла --inspect появился в версии 6 узла. Эта функция позволяет отлаживать и проверять процесс вашего узла из DevTools Chrome.

Просто запустите приложение, передав флаг --inspect:

$ node --inspect index.js

Перейдите по URL-адресу инспектора и перейдите на вкладку памяти.

Вкладка DevTools Memory

enter image description here Вот что мы будем делать:

Хит приложение с автоканоном -c 1 -d 60HTTP: // локальный: PORT
[ https://www.npmjs.com/package/autocannon ]
Сделайте снимок кучи примерно через 10 секунд и снова через 30 секунд.

Сравнение снимков кучи
Сравнение показывает нам, что произошло между снимками. Вы можете видеть огромное количество объектов, которые были созданы или не были собраны GC.

Пожалуйста, прочитайте эти удивительные статьи, чтобы узнать больше.
Они очень помогли найти & amp; устранить утечку: -

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/

2

Я использую инструменты разработчика Chrome и файл heapsnapshot напрямую, а не node-inspector или node-webkit-agent.

require() heapdump модуль.

Отправьте сигнал usr2 запущенному процессу nodejs, чтобы получить файл heapsnapshot.

Загрузите файл heapsnapshot на вкладке профилей инструментов Chrome dev.

0

Одна хорошая вещь https://github.com/bnoordhuis/node-heapdump очень просто, и вы можете просматривать результаты в Chrome (из-за того же движка V8 в браузере javascript и nodejs) и сравнивать размеры объектов в памяти в любой момент, когда захотите.

И еще один совет, как обнаружить утечку памяти "вручную" или помогите предотвратить это, принудительно соберите сборщик мусора в некоторых местах вашего кода и посмотрите, что произойдет.

Запустите ваше приложение с помощью & quot; узла --expose-gc file.js & quot; и в любом месте кода вы можете использовать функцию gc (); вызывать сборщик мусора.

6

Я также мог бы порекомендовать следующие источники:

  1. following episodes of NodeUp, where profiling and memory leaks detection tools are discussed:

  2. This article - Tracking Down Memory Leaks in Node.js – A Node.JS Holiday Season, which basically aggregates all widely known modules and techniques to track down memory leaks

  3. For Mac OS - Instruments tool could be helpful to debug native (C++) modules. It is not so sophisticated as SmartOS tools, but very easy to setup.
21

Следующий инструмент должен быть полезен для обнаружения утечек памяти:

Узел-инспектор

И здесь также есть учебник, который поможет вам найти утечки памяти:

https://github.com/felixge/node-memory-leak-tutorial

10

В отслеживании утечки памяти я попробовал вышеупомянутый узел-инспектор.
По состоянию на апрель 2012 года он не был обновлен для работы с современной версией узла v0.6.12. Как таковой я нашел:https://github.com/c4milo/node-webkit-agent.
Он смог показать снимки кучи для более нового движка V8, который не был поддержан инспектором узлов. В скором времени мне удалось обнаружить протекающий модуль (в случае чего логгл), надеюсь, у вас аналогичный успех!

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
1

Я использовал пакет npm Memwatch:

Посмотрите наGithub хранилище и Источник NPM

По сути, этот пакет проверяет использование кучи памяти сразу после сборки мусора ядром V8 и дает базовую оценку фактического использования памяти.

Вот как я это использовал:

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);
});

Из оригинальной документации:

The 'stats' event, emitted occasionally, give you the data describing your heap usage and trends over time.

The 'leak' event, is emitted when it appears your code is leaking memory. It is usually executed when the heap size continously grows in a short period of time.

Memwatch также предоставляет «HeapDiff» класс для вычисления состояния кучи между двумя снимками, которые вы можете использовать в своих функциях.

Это может быть хорошей идеей, чтобы memwatch работал в вашей рабочей среде, чтобы отслеживать события, вызывающие проблему.

Error: User Rate Limit Exceededmemwatch-nextError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы