В Node.js есть встроенный профилировщик (на самом деле, это V8 profiler). Запустить его можно через флаг --prof.
Он сэмплирующий, т.е. он делает сэмплы стека вызовов с равномерным интервалом и пишет результат в отчет. Соответственно, потом этот отчет можно перевести в человекочитаемый файл, где приведена статистика по вызовам.
Классно то, что профилировщик корректно работает с нативными вызовами, а не только с JS кодом. При этом, к сожалению, вся документация на него сводится вот к этой статье:
nodejs.org/en/docs/guides…
Из человекочитаемого представления можно почерпнуть, какие вызовы выглядят подозрительно (они, как правило, будут где-то в топе). Но бывает полезно построить flame graph. Проще всего это сделать с помощью библиотеки 0x. Подробнее в гайде:
nodejs.org/en/docs/guides…
На flame graph нужно смотреть на так называемые плато, т.е. вызовы, оказавшиеся во многих сэмплах. Но в реальных бенчмарках ярко выраженных плато может не оказаться или же они могут быть false positive. В этом случае придется перебирать подозрительные вызовы и строить гипотезы.
Вообще, прежде чем браться за профилировщик, советую изолировать анализируемую часть функционала в бенчмарк и уже его профилировать. Если запустить профилировщик на всем приложении, разобраться в полученных данных будет почти невозможно.
И разумеется, если у вас проблемы с памятью, то этот профилировщик вам не поможет.