Куча Node.JS V8 быстро растет, хотя использование остается прежним

Я запускаю веб-приложение Node.JS, которое отлично работает в течение нескольких часов, а затем в какой-то случайный момент времени куча V8 внезапно начинает очень быстро расти без причины, и примерно через 40 минут этот рост обычно прекращается, и процесс продолжает нормально работать.

Я отслеживаю это с помощью nodetime:

Что может быть причиной этого? Это утечка памяти в моей программе или, возможно, ошибка в V8?


person Overv    schedule 27.03.2014    source источник
comment
Я вижу то же самое. Я построил график вывода process.memoryUsage() для своего приложения, и вот как он выглядит: i.imgur.com/TxvMSwu.png   -  person Robert Larsen    schedule 20.07.2015


Ответы (1)


Невозможно узнать, в чем проблема, по тому, что вы предоставили, но есть вероятность 99,99%, что проблема находится внутри/исправима в вашем коде.

Лучшие инструменты, которые я нашел для отладки проблем с памятью в Node.js, — это https://github.com/bnoordhuis/node-heapdump, вы можете настроить его для дампа через определенные интервалы, или по умолчанию он прослушивает сигнал USR2, поэтому вы можете отправить kill -s USR2 в pid вашего процесса и получить снимок.

Затем вы можете использовать Chrome Inspector, чтобы загрузить кучу в инструмент профилирования и начать проверку.

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

person Ryan Gibbons    schedule 27.03.2014
comment
Черт, кажется, на моем текущем сервере недостаточно памяти для создания полного снимка, но я отмечу это как ответ, потому что данные из тестового снимка действительно выглядят очень полезными. - person Overv; 27.03.2014
comment
Я обнаружил, что heapdump составляет всего 300 МБ, хотя использование памяти составляет 1,4 ГБ, поэтому мне придется попробовать что-то еще. - person Overv; 28.03.2014
comment
Размер дампов не равен размеру используемой памяти. Я бы сделал дамп с размером файла 28 МБ, но использование памяти было более 200 МБ, то, что вы ищете, - это объекты, которые стали слишком большими или имеют слишком много экземпляров. - person Ryan Gibbons; 28.03.2014
comment
Да, но process.memoryUsage() показывает ту же разницу между общим размером кучи и использованием. - person Overv; 28.03.2014