Ответ
В Go экосистеме есть мощный встроенный инструментарий для профилирования, а также полезные сторонние утилиты.
Стандартная библиотека
-
pprof
— основной и самый мощный инструмент. Он позволяет собирать и анализировать данные о:- CPU: выявление функций, которые потребляют больше всего процессорного времени.
- Heap (Память): анализ распределения памяти и поиск утечек.
- Goroutines: отслеживание количества и состояния всех горутин.
- Mutex Contention: выявление блокировок, замедляющих работу.
Профиль можно снять с работающего приложения, добавив
import _ "net/http/pprof"
и запустив веб-сервер.import ( _ "net/http/pprof" "net/http" "log" ) func main() { go func() { log.Println(http.ListenAndServe("localhost:6060", nil)) }() // ... ваш основной код }
Анализ выполняется командой:
go tool pprof http://localhost:6060/debug/pprof/profile
. -
trace
— инструмент для трассировки выполнения программы. Он идеален для анализа проблем с задержками (latency), конкурентностью и работой планировщика Go. Результат — это подробный временной график выполнения.f, _ := os.Create("trace.out") defer f.Close() trace.Start(f) defer trace.Stop() // Код, который нужно проанализировать
Анализ:
go tool trace trace.out
. -
Бенчмарки (
testing.B
) — используются для измерения производительности отдельных функций (микробенчмарки). Запускаются с помощьюgo test -bench=.
.
Сторонние инструменты
go-torch
: Генерирует Flame Graphs (огненные графы) для профилей CPU, что делает их визуально понятными.statsviz
: Визуализирует метрикиpprof
иexpvar
в реальном времени прямо в браузере.gops
: Утилита командной строки для получения списка запущенных Go-процессов и диагностики их состояния.