Profiling Node — инструменты

Набор флагов и инструментов для профилирования Node.js и V8 — от --inspect и Chrome DevTools до clinic.js, 0x и V8-нативного --prof.

Built-in флаги Node

# Chrome DevTools поверх Node
node --inspect script.js
node --inspect-brk script.js   # сразу остановиться на первой строке

# CPU профилирование без DevTools
node --prof script.js
node --prof-process isolate-0x*.log > profile.txt

# Деопты и оптимизации
node --trace-opt --trace-deopt script.js
node --trace-ic script.js
node --trace-bailout script.js

# Heap snapshot
node --heapsnapshot-signal=SIGUSR2 script.js   # kill -USR2 <pid>

# GC трейс
node --trace-gc script.js
node --trace-gc-verbose script.js

Сторонние инструменты

  • clinic.js doctor — диагностика типа проблемы (CPU/I/O/GC).
  • clinic.js flame — flamegraph CPU.
  • 0x — single-command flamegraph.
  • autocannon — load-test.
  • perf (Linux) + --perf-basic-prof — глубокий kernel-level профиль.

CPU vs Memory профилирование

Тип Когда
CPU profile (sampling) Тормозит код, ищем горячие функции
Allocation timeline Растёт память, ищем кто аллоцирует
Heap snapshot Утечки, сравнение трёх снимков
Heap allocation sampling Память растёт постепенно, redundant alloc

Performance API в коде

performance.mark('a');
// ... код ...
performance.mark('b');
performance.measure('op', 'a', 'b');
console.log(performance.getEntriesByName('op')[0].duration);

Подводные камни

  • console.time округляет до миллисекунд. Для микро-замеров — performance.now().
  • Sampling-профилировщик не видит коды короче sample interval (~1ms).
  • Heap snapshot замораживает приложение — не для прода.
  • В Node < 18 --inspect пробрасывает порт небезопасно.

Источники

См. также