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пробрасывает порт небезопасно.
Источники
- Измерение производительности кода и оптимизация в JavaScript и Node.js · 2018-10-24
- JavaScript Tools Performance Evaluation (devices04) · AsForJS · 2023-12-04
- Утечки памяти в Node.js и JavaScript · 2018-12-19