Какие инструменты для профилирования производительности существуют в Go?

Ответ

В Go экосистеме есть мощный встроенный инструментарий для профилирования, а также полезные сторонние утилиты.

Стандартная библиотека

  1. 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.

  2. trace — инструмент для трассировки выполнения программы. Он идеален для анализа проблем с задержками (latency), конкурентностью и работой планировщика Go. Результат — это подробный временной график выполнения.

    f, _ := os.Create("trace.out")
    defer f.Close()
    trace.Start(f)
    defer trace.Stop()
    
    // Код, который нужно проанализировать

    Анализ: go tool trace trace.out.

  3. Бенчмарки (testing.B) — используются для измерения производительности отдельных функций (микробенчмарки). Запускаются с помощью go test -bench=..

Сторонние инструменты

  • go-torch: Генерирует Flame Graphs (огненные графы) для профилей CPU, что делает их визуально понятными.
  • statsviz: Визуализирует метрики pprof и expvar в реальном времени прямо в браузере.
  • gops: Утилита командной строки для получения списка запущенных Go-процессов и диагностики их состояния.