Для чего используется профилирование pprof в Go
Что проверяют
Умеете ли вы искать причину медленной работы измерением, а не догадками. Заодно смотрят, знаете ли вы, что профилировать можно и боевой сервис.
Как отвечать
pprof собирает профили работающей программы и показывает, куда уходят ресурсы. Основные виды профилей стоит назвать по назначению:
- CPU: где программа проводит процессорное время, сбор по сэмплам;
- heap: что занимает память сейчас и что выделялось всего. Первое помогает искать утечки, второе давление на сборщик мусора;
- goroutine: сколько горутин и где они стоят. Растущее число это утечка горутин;
- block и mutex: где программа ждёт на каналах и блокировках, включаются отдельно;
- trace (отдельный инструмент): планировщик, паузы сборщика, задержки в реальном времени.
Как подключают: в сервисе достаточно импортировать net/http/pprof, и профили появятся на служебном порту, который не выставляют наружу. В тестах и бенчмарках профили снимают флагами -cpuprofile, -memprofile, а -benchmem сразу показывает аллокации на операцию.
Смотрят результат через go tool pprof: список самых дорогих функций, дерево вызовов, граф и flame graph в веб-интерфейсе.
Типичный порядок работы: заметили симптом по метрикам, сняли профиль под нагрузкой, нашли верхние функции, посмотрели аллокации, поправили, сняли профиль снова и сравнили. Сравнение до и после это обязательная часть, иначе непонятно, помогло ли.
Где спотыкаются
Оптимизируют по интуиции и переписывают код, который в профиле занимает доли процента.
Выставляют эндпоинт профилирования в интернет: это утечка внутренней информации и способ нагрузить сервис.
Снимают профиль на холостом сервисе и не видят ничего интересного: профиль нужен под реальной нагрузкой.