@spyfox87

NodeJS: растет потребление heapTotal. Утечка памяти?

Тестирую сервис с помощью ab, получаю такой график по потреблению памяти:
2bc20b45d0414afe87c18ff54b033560.png

Где:
Зеленый график - heapUsed.
Черный - heapTotal.
Синий - RSS.

По heapUsed, видно, что память растет и очищается. Вроде бы все ок. Но heapTotal и RSS растут постоянно.

Если прекратить все запросы на сервис, то график будет выглядеть так:
24bec4f4e5e54c858ae599201a8d850a.png

heapUsed упадет, но heapTotal и RSS - нет.

Является ли такое поведение признаками утечки памяти? Почему не очищается heapTotal?
  • Вопрос задан
  • 3779 просмотров
Пригласить эксперта
Ответы на вопрос 5
Не является.
heapTotal это общая память, выделенная V8. Эта память, в основном, освобождается только при выходе. Выделение памяти происходит медленно, поэтому V8 не возвращает ее, предполагая, что она снова может понадобиться. Если на сборщик мусора приходится большая нагрузка, V8 пытается увеличить память, чтобы запускать его реже.
Ответ написан
@vasIvas
Утечка, это когда GC ( сборщик мусора ) не может удалить использованный объект, так как на него кто-то ссылается, что приводит к увеличению памяти.

Если судить по Вашим графикам, то черная и синяя полоса всегда растет, но не известно сколько времени прошло. Запустите и тестируйте минут пять, а потом уже смотрите, да и нам покажите результат.

Вчера только статья была, что в iojs нашли утечку, но ещё не устранили.
Но у Вас я так понимаю nodejs?
Ответ написан
Комментировать
@asd111
Вариантов почему происходит утечка много. Возможно косяк в коде, когда из какой то структуры данных элементы не удаляются а только добавляются, возможно в самом NodeJS где то косяк. Попробуйте локализовать проблему более конкретно, т.е. нужно глянуть какая именно структура данных постоянно увеличивается в объеме. И потом можно либо менять свой код, либо сказать авторам NodeJS о баге.

А можно просто перезапускать NodeJS с определенным интервалом.

Еще как вариант возможно поможет Как избежать утечки памяти в nodejs?
Ответ написан
@vsvladimir
Не знаю тонкостей управления памятью (но знаю что там много нюансов, которые зависят от системы). Но наблюдал за изменением rss статистически в одном проекте. RSS какое-то время только растет (в моем случае несколько дней) и потом стабилизируется на определенной отметке (в моем случае уже несколько месяцев). Остается дождаться стабилизации и тогда будет видно, что утечек памяти нет.
Ответ написан
Комментировать
@spyfox87 Автор вопроса
Поставил тест на ночь.
Запуск:
8d0570cc20fe4b3eaa329d117453c054.png

HeapTotal и RSS растут. HeapUsed колеблется от 65мб до 350мб

Утром:
215f62c1da8145b9bdbb4a69ce824eeb.png
HeadTotal и RSS рост прекратился и составляют 1,46-1,49ГБ и 1,50-1,53ГБ
HeapUsed колеблется от 1,345ГБ где до 1,456 ГБ

Тест остановил. С одной стороны все ок, но почему то нижняя граница интервала HeapUsed сильно вырасла с 65мб до 1,345ГБ.

Поставлю тест дня на 3 на отдельном серваке и посмотрю за результатом.

Всем спасибо за ответы!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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