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 MB, въпреки че използваната памет е 1,4 GB, така че ще трябва да опитам нещо друго. - person Overv; 28.03.2014
comment
Размерът на дъмповете не е равен на размера на използваната памет. Бих направил дъмп с размер на файла 28 MB, но използването на паметта беше над 200 MB, това, което търсите, са обекти, които са станали твърде големи или все още имат твърде много екземпляри. - person Ryan Gibbons; 28.03.2014
comment
Да, но process.memoryUsage() показва същата разлика между общия размер на купчината и използването. - person Overv; 28.03.2014