Как профилировать производительность Go-приложения (CPU, память)?

Ответ

Для профилирования 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