Ответ
Для профилирования Go-приложений используется встроенный пакет pprof
. Он позволяет анализировать использование CPU, памяти, блокировки горутин и многое другое.
1. Интеграция pprof
в веб-сервер
Самый простой способ — импортировать пакет net/http/pprof
, который автоматически регистрирует обработчики для сбора данных профилирования.
import (
"log"
"net/http"
_ "net/http/pprof" // Важно: импорт с подчеркиванием для регистрации эндпоинтов
)
func main() {
// Запускаем сервер pprof на отдельном порту (хорошая практика)
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
// ... здесь ваш основной код приложения
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello, World!"))
})
log.Fatal(http.ListenAndServe(":8080", nil))
}
После запуска, данные для профилирования будут доступны по адресу http://localhost:6060/debug/pprof/
.
2. Сбор и анализ данных
Используется утилита go tool pprof
.
-
Профилирование CPU: Собирает данные о самых ресурсоемких функциях в течение 30 секунд.
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30
-
Профилирование памяти (Heap): Показывает, какие функции выделяют больше всего памяти.
go tool pprof http://localhost:6060/debug/pprof/heap
3. Работа в интерактивном режиме pprof
После запуска одной из команд выше, вы попадете в интерактивную консоль pprof
. Основные команды:
top10
: Показать 10 самых "тяжелых" функций.list <имя_функции>
: Показать исходный код функции с аннотациями по ресурсам.web
: Сгенерировать и открыть визуальный граф вызовов в браузере (требуется установленный Graphviz).peek <имя_функции>
: Показать "вершину" графа вызовов для функции.
4. Визуализация (Flame Graphs)
Для более наглядного анализа CPU используются Flame Graphs (огненные графы). Их можно сгенерировать с помощью инструментов вроде go-torch
.
5. Трассировка выполнения
Позволяет получить детальную картину выполнения горутин, системных вызовов и событий сборщика мусора за короткий промежуток времени.
# Собираем данные трассировки за 5 секунд
curl -o trace.out http://localhost:6060/debug/pprof/trace?seconds=5
# Запускаем инструмент для анализа
go tool trace trace.out