Перейти к содержанию

Диагностика утечек памяти и профилирование производительности

Начало урока

Диагностика утечек памяти и профилирование производительности

Найдите реальную утечку и реальное узкое место внутри одного процесса Node

Главная идея: Кластеризация и пул воркеров позволяют масштабировать сервис вширь, но они никогда не скажут, почему один процесс тормозит или почему его память растёт, пока OOM-killer не перезапустит его. Профилирование — это дополняющий навык работы внутри процесса: подключите инспектор V8, снимите снимки кучи (heap snapshots) и профили CPU / flame-графы, прочитайте их, чтобы найти удерживающую ссылку или горячую функцию, исправьте и докажите исправление, измерив показатели до и после под реалистичной нагрузкой.
К концу вы сможете:
  • подключать инспектор 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 выглядит скромной.

Аналогия. Утечка — это медленная капля, наполняющая ванну: уровень тихо поднимается, пока не перельётся, а покупка большей ванны (больше ОЗУ) лишь оттягивает потоп. Блокировка цикла событий — единственная касса в загруженном магазине: неважно, сколько пришло покупателей, все ждут за тем, кто выполняет медленную операцию. Профилирование — это диагностический снимок, который говорит, какая труба капает и какая касса застряла, вместо догадок.

Продолжите этот урок на YourAIZone

В полном уроке — объяснение целиком, разобранные примеры, частые ошибки, тесты с мгновенной проверкой и ИИ-репетитор. Начните сразу как гость или создайте аккаунт, чтобы сохранять прогресс.

В полном уроке

  • Объяснение целиком
  • Разобранные примеры
  • Частые ошибки и как их избежать
  • Тестовые вопросы: 15
  • ИИ-репетитор, который отвечает на вопросы по теме
  • Отслеживание прогресса для ученика, родителей и учителя