Диагностика утечек памяти и профилирование производительности
Найдите реальную утечку и реальное узкое место внутри одного процесса Node
- подключать инспектор V8 через
--inspectи снимать профили без GUI через--cpu-prof/--heapsnapshot-near-heap-limit; - читать
process.memoryUsage()и отличать настоящую утечку от обычной задержки сборки мусора; - применять технику трёх снимков и различать shallow и retained размер, чтобы найти, что удерживает память;
- читать flame-граф — self time против total time — чтобы найти горячий путь;
- измерять и устранять блокировку цикла событий через
monitorEventLoopDelay; - оценивать исправление, сравнивая метрики до/после под нагрузкой.
1. Почему диагностика внутри процесса — отдельный навык
Масштабирование вширь (тема Производительность и кластеризация) умножает то, что у вас уже есть. Если каждый воркер теряет 5 МБ в минуту, запуск восьми воркеров означает потерю 40 МБ в минуту в восьми процессах, которые все перезапускаются по OOM. Добавление железа на время прячет симптом и повышает счёт; дефект оно не убирает. Диагностика — это обратный ход: вы сужаете проблему до одного процесса, подключаете инструменты и смотрите внутрь.
В долгоживущих сервисах Node доминируют две формы отказа:
- Утечки памяти. Живая куча растёт без границ, потому что что-то удерживает ссылку, которую следовало освободить. Резидентная память (RSS) ползёт вверх часами или днями, затем ядро убивает процесс по OOM (или контейнер упирается в лимит и перезапускается).
- Блокировка цикла событий. Один синхронный, тяжёлый по CPU вызов замораживает единственный поток, обслуживающий все запросы. Пропускная способность падает, а хвостовая задержка (p99) взрывается, хотя средняя загрузка CPU выглядит скромной.
Аналогия. Утечка — это медленная капля, наполняющая ванну: уровень тихо поднимается, пока не перельётся, а покупка большей ванны (больше ОЗУ) лишь оттягивает потоп. Блокировка цикла событий — единственная касса в загруженном магазине: неважно, сколько пришло покупателей, все ждут за тем, кто выполняет медленную операцию. Профилирование — это диагностический снимок, который говорит, какая труба капает и какая касса застряла, вместо догадок.