Способы поиска проблем производительности на проде?go-92

1. Инструменты мониторинга и профилирования

Встроенные профилировщики Go

import _ "net/http/pprof"

go func() {
    log.Println(http.ListenAndServe(":6060", nil))
}()

Доступные профили:

  • http://localhost:6060/debug/pprof/heap — профиль памяти
  • http://localhost:6060/debug/pprof/profile — CPU профиль
  • http://localhost:6060/debug/pprof/goroutine?debug=2 — дамп горутин

Пример анализа через pprof:

go tool pprof -http=:8080 http://localhost:6060/debug/pprof/profile?seconds=30

2. Метрики в реальном времени

Prometheus + Grafana

Пример экспорта метрик:

import "github.com/prometheus/client_golang/prometheus"

var (
    requests = prometheus.NewCounterVec(
        prometheus.CounterOpts{
            Name: "http_requests_total",
            Help: "Total HTTP requests",
        },
        []string{"method", "status"},
    )
)

func init() {
    prometheus.MustRegister(requests)
}

Ключевые метрики:

  • Latency (p50, p90, p99)
  • Throughput (RPS)
  • Error rate
  • Goroutine count
  • GC pauses

3. Логирование с таймингами

Структурированное логирование:

import "go.uber.org/zap"

logger, _ := zap.NewProduction()
defer logger.Sync()

logger.Info("Request processed",
    zap.String("path", r.URL.Path),
    zap.Duration("duration", elapsed),
    zap.Int("status", statusCode),
)

4. Distributed Tracing

Пример с Jaeger:

import "go.opentelemetry.io/otel"

tracer := otel.Tracer("service-name")
ctx, span := tracer.Start(ctx, "operation-name")
defer span.End()

5. Анализ конкретных проблем

Утечки памяти:

go tool pprof -alloc_space http://localhost:6060/debug/pprof/heap

Горячие точки CPU:

go tool pprof -http=:8080 http://localhost:6060/debug/pprof/profile

Блокировки горутин:

curl http://localhost:6060/debug/pprof/goroutine?debug=1 > goroutines.txt

6. Профилирование в продакшене

Безопасные методы:

  1. Сэмплирование (1% трафика)
  2. Теплые запросы (отдельный эндпоинт)
  3. Теневое копирование (shadow traffic)

Пример безопасного профилирования:

if rand.Intn(100) == 0 { // 1% запросов
    f, _ := os.Create(fmt.Sprintf("cpu_%d.pprof", time.Now().Unix()))
    pprof.StartCPUProfile(f)
    defer pprof.StopCPUProfile()
}

7. Анализ GC

Метрики GC:

import "runtime/debug"

debug.SetGCPercent(100) // Настройка GC

Просмотр статистики:

GODEBUG=gctrace=1 ./myapp

Чеклист для быстрого реагирования

  1. Проверить метрики (CPU, memory, goroutines)
  2. Снять pprof (CPU, heap, goroutine)
  3. Проанализировать логи с таймингами
  4. Исследовать трассировки для end-to-end анализа
  5. Сравнить с бенчмарками и предыдущими релизами

Резюмируем

эффективный поиск проблем производительности требует комбинации инструментов — pprof для детального анализа, метрик для мониторинга в реальном времени, трассировок для распределенных систем и структурированного логирования. Всегда начинайте с метрик высокого уровня, затем переходите к профилям и глубокому анализу.