Go: Профилирование

9 вопросов

1 Какие профили поддерживает pprof в Go?

Пакет runtime/pprof и go tool pprof работают с типами: cpu (процессорное время), heap (выделения памяти, аллокации), allocs (все аллокации), goroutine, threadcreate, block (блокировки), mutex. Профили можно снимать программно или через HTTP endpoint /debug/pprof/.

import _ "net/http/pprof"
go http.ListenAndServe(":6060", nil)
// go tool pprof http://localhost:6060/debug/pprof/heap
Открыть отдельно →
2 Как включить и анализировать CPU-профиль?

Через HTTP: go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30 (по умолчанию 30 сек). Или в коде: pprof.StartCPUProfile(f), работа, pprof.StopCPUProfile(). В pprof: top - топ по времени, list FuncName - по строкам, web - граф вызовов (нужен graphviz).

f, _ := os.Create("cpu.prof")
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
doWork()
Открыть отдельно →
3 Как снимать и читать memory (heap) профиль?

Получить heap: go tool pprof http://localhost:6060/debug/pprof/heap или pprof.WriteHeapProfile(f). В интерактиве: top - по занятой памяти или по аллокациям (inuse_space / alloc_space), list pkg.Func - где выделено. -alloc_space показывает куда уходят аллокации за все время.

go tool pprof -alloc_space http://localhost:6060/debug/pprof/heap
(pprof) top20
(pprof) list mypkg.Allocator
Открыть отдельно →
4 Что показывает goroutine профиль?

Профиль goroutine - снимок всех горутин и их стеков. Помогает искать утечки горутин (растет число) и понимать, где они блокируются. Получить: /debug/pprof/goroutine?debug=2 (текст) или через pprof. В pprof команда traces или веб-интерфейс показывают дерево стеков.

go tool pprof http://localhost:6060/debug/pprof/goroutine
(pprof) traces
(pprof) web
Открыть отдельно →
5 Как построить flame graph из pprof?

Flame graph визуализирует профиль: ширина - доля времени/памяти, иерархия - стеки вызовов. Варианты: go tool pprof -http=:8080 cpu.prof и в браузере выбрать "Flame Graph", или конвертировать в формат для flamegraph.pl. Удобно искать "широкие" участки - горячие пути.

go tool pprof -http=:8080 cpu.prof
# в UI: View -> Flame Graph
# или: go tool pprof -raw -output=cpu.txt cpu.prof
Открыть отдельно →
6 Что такое go tool trace? Когда использовать?

go tool trace работает с файлом трассировки (генерируется при runtime/trace или через /debug/pprof/trace?seconds=5). Показывает временную шкалу: горутины, потоки ОС, GC, блокировки. Используют для анализа латентности, планировщика, блокировок - когда pprof по CPU/heap недостаточен.

f, _ := os.Create("trace.out")
trace.Start(f)
defer trace.Stop()
// ...
// go tool trace trace.out
Открыть отдельно →
7 Что такое benchstat? Зачем нужен?

benchstat - утилита для сравнения результатов бенчмарков (например до и после изменения). Запускают бенчмарки несколько раз, сохраняют вывод в файлы, затем benchstat old.txt new.txt. Показывает среднее, разброс и статистическую значимость различий. Удобно для регрессий производительности.

go test -bench=BenchmarkX -count=10 > old.txt
# change code
go test -bench=BenchmarkX -count=10 > new.txt
benchstat old.txt new.txt
Открыть отдельно →
8 Что такое continuous profiling?

Continuous profiling - постоянный сбор профилей в продакшене (CPU, heap, goroutine по расписанию или по триггеру). Анализ трендов и аномалий, поиск узких мест под реальной нагрузкой. Реализации: собственный сбор через pprof endpoint и хранилище, или сервисы (Pyroscope, Datadog, Google Cloud Profiler). Важно низкий overhead (короткие интервалы CPU, выбор момента для heap).

Открыть отдельно →
9 Как пользоваться pprof web UI?

Запуск веб-интерфейса: go tool pprof -http=:8080 profile.pb.gz (или URL напрямую). В браузере доступны: граф вызовов (Graph), flame graph, top, source. Можно переключать тип отображения (Sample), фильтровать. Для живого процесса: go tool pprof -http=:8080 http://localhost:6060/debug/pprof/heap.

go tool pprof -http=:8080 cpu.prof
# открывается браузер с Graph/Flame/Peek/Source
Открыть отдельно →
🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.