Frontend и backend разработка: JavaScript, TypeScript, React, Next.js, Vue, Node.js, PHP, REST и GraphQL API, вёрстка HTML/CSS и современные веб-приложения.
Две недели прод тёк по 2ГБ в день. Симптомы классика: api тормозит, рестарт помогает, через сутки всё по новой. Поставили крон на рестарт в 4 утра как костыль и сделали вид что так и задумано.
Нашёл. Снял два heap snapshot с разницей в 5 минут под нагрузкой, сравнил retained size. Рос глобальный объект sessionCache куда складывали сокеты юзеров и забывали чистить на disconnect.
О, у нас был один в один кейс но с прокси. express-http-proxy держал ссылки на request объекты и не отпускал. Полдня смотрел на снапшоты пока не дошло.
Главный лайфхак тут — снимать снапшоты именно под реальной нагрузкой, а не на пустом локале где ничего не течёт. У нас локально вообще не воспроизводилось.
Вот да, локально 0 утечки. В итоге зеркалили часть боевого трафика на отдельный инстанс с --inspect и там уже спокойно ковыряли. Без этого искали бы до сих пор.
Совет на будущее: повесьте алерт на process.memoryUsage().heapUsed и rss. Когда rss растёт линейно и не падает после gc — это почти всегда утечка, узнаете за день а не за две недели.