2012-05-14 3 views
30

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

+2

Я читал этот блог, и я нахожу это полезным, http: // DTrace. org/blogs/bmc/2012/05/05/debugging-node-js-memory-leaks/ – tawfekov

ответ

10

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

+2

Это работает очень хорошо. Я использовал это для узла v0.8.x тоже –

+1

+1 для узла-инспектора. – liuyanghejerry

6

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

  1. следующие эпизоды NodeUp, где профилирование и утечек памяти обсуждаются средства обнаружения:

  2. Это ar ticle - Tracking Down Memory Leaks in Node.js – A Node.JS Holiday Season, который в основном объединяет все широко известные модули и методы для отслеживания утечек памяти.

  3. Для Mac OS - Instruments инструмент может быть полезен для отладки собственных (C++) модулей. Он не настолько утончен, как инструменты SmartOS, но очень прост в настройке.
2

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

require()heapdump модуль.

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

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

0

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

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

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

1

Я использовал НПМ пакет Memwatch:

Посмотрите на Github repository и NPM source

В основном этот пакет проверяет использование кучи памяти сразу после сбора мусора осуществляется двигателем 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); 
}); 

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

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

Событие 'leak', излучается, когда он кажется, что ваш код протекает память. Он обычно выполняется, когда размер кучи постоянно увеличивается в за короткий промежуток времени.

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

Возможно, было бы неплохо иметь функцию memwatch в вашей сцене, чтобы отслеживать события, вызывающие проблему.

+1

memwatch уже мертв – mateeyow

+0

Вам нужен 'memwatch-next', он поддерживает одни и те же вызовы. –

1

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

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

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

Метод 2 - --inspect флаг

3 Heap отвалы Method

Node приземлился в узле версии 6. Эта функция позволяет отладить и проверить процесс вашего узла изнутри Devtools Chrome.

Просто запустите приложение пропускания --inspect флага:

$ node --inspect index.js

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

DevTools Tab памяти

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

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

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

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

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/

Смежные вопросы