В этом документе вы узнаете, как отлаживать проблемы, связанные с памятью.
Node.js (JavaScript) — язык со сборкой мусора, поэтому утечки памяти возможны через удерживающие ссылки (retainers). Поскольку приложения на Node.js обычно многопользовательские (multi-tenant), бизнес-критичные и долгоживущие, обеспечение доступного и эффективного способа найти утечку памяти существенно важно.
Можно также тонко настраивать память для получения конкретных результатов. Подробнее см. Понимание и тонкая настройка памяти.
Пользователь наблюдает непрерывно растущее использование памяти (быстро или медленно, на протяжении дней или даже недель), затем видит, как процесс падает и перезапускается менеджером процессов. Процесс, возможно, работает медленнее, чем раньше, и перезапуски приводят к сбою части запросов (балансировщик нагрузки отвечает 502).
- Перезапуски процесса из-за исчерпания памяти, и запросы «роняются на пол» (dropped on the floor)
- Повышенная активность GC ведёт к более высокому использованию CPU и более медленному времени отклика
- GC блокирует Event Loop, вызывая замедление
- Повышенный своп (swapping) памяти замедляет процесс (активность GC)
- Может не хватить доступной памяти, чтобы получить Heap Snapshot
Приложение использует неожиданный объём памяти, и/или мы наблюдаем повышенную активность сборщика мусора.
- Повышенное число ошибок страниц (page faults)
- Более высокая активность GC и использование CPU
Большинство проблем с памятью можно решить, определив, сколько места занимает наш конкретный тип объектов и какие переменные не дают им быть собранными сборщиком мусора. Также может помочь знание паттерна аллокаций нашей программы во времени.