Ответ
В Go есть мощный встроенный инструментарий для анализа производительности. Основные подходы:
-
Бенчмарки (
testing
) Для измерения производительности конкретных функций в изолированной среде. Это первый шаг для поиска узких мест на микроуровне.// Файл my_func_test.go func BenchmarkMyFunction(b *testing.B) { for i := 0; i < b.N; i++ { MyFunction() // Код, который тестируем } }
Запуск:
go test -bench=. -benchmem
флаг-benchmem
также покажет количество аллокаций. -
Профилирование (
pprof
) Это основной инструмент для анализа работающего приложения. Он позволяет собирать данные о:- CPU: где программа тратит процессорное время.
- Heap: какие объекты занимают больше всего памяти.
- Goroutine: где и почему заблокированы горутины.
- Mutex: где происходят основные конфликты блокировок.
Проще всего подключить его к веб-серверу:
import _ "net/http/pprof" func main() { go func() { // Сервер pprof будет доступен на localhost:6060 log.Println(http.ListenAndServe("localhost:6060", nil)) }() // ... ваш основной код }
Анализ:
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30
-
Трассировка (
go tool trace
) Инструмент для детального анализа выполнения программы во времени. Идеален для поиска проблем с задержками (latency), параллелизмом и работой сборщика мусора.Сбор данных:
f, _ := os.Create("trace.out") defer f.Close() trace.Start(f) defer trace.Stop() // ... ваш код ...
Анализ:
go tool trace trace.out
-
Пользовательские метрики (
expvar
) Пакетexpvar
позволяет публиковать произвольные переменные (например, счетчики запросов, активные сессии) через HTTP в формате JSON для мониторинга в реальном времени.
Общий подход: Начать с бенчмарков для отдельных функций, затем использовать pprof
для поиска узких мест в работающем приложении, и trace
для глубокого анализа сложных проблем с задержками.