> Как расследовать проблему медленной работы сервиса и какие метрики и инструменты использовать (Go)

Уровень: senior · Роль: backend · Категория: Технические вопросы

Компании: Т-Банк

Стек: Go

> Пример ответа

При расследовании проблем с производительностью Go-сервиса я действую по следующему плану:

  1. Сбор первичных данных - проверяю метрики из Prometheus/Grafana: latency (p50, p95, p99), throughput (RPS), error rate, CPU/memory usage. Если метрик нет, подключаю профилирование через pprof.

  2. Локализация узкого места:

    • Использую net/http/pprof для CPU и heap профилей: go tool pprof -http=:8080 http://service/debug/pprof/profile?seconds=30.

    • Смотрю на блокировки через block и mutex профили.

    • Для запросов в реальном времени - trace профиль: go tool trace trace.out.

  3. Анализ конкретных метрик:

    • CPU: если высокий - ищу горячие функции (например, неэффективные алгоритмы, частые аллокации).

    • Memory: heap профиль показывает объекты, удерживающие память. Проверяю утечки через go tool pprof -alloc_space и -inuse_space.

    • Latency: распределение времени по слоям (БД, внешние API, обработка). Использую распределённый трейсинг (Jaeger/OpenTelemetry).

    • Goroutines: runtime.NumGoroutine() - если их тысячи, ищу утечки или неэффективные горутины (например, бесконечные каналы).

  4. Инструменты:

    • pprof - для профилирования CPU, памяти, блокировок.

    • trace - для анализа задержек, GC, синхронизации.

    • expvar - для кастомных метрик (например, размер очереди, время обработки).

    • Prometheus + Grafana - для долгосрочного мониторинга.

    • Jaeger - для трейсинга запросов.

  5. Типичные проблемы в Go:

    • Частые аллокации (GC pressure) - оптимизирую через sync.Pool или переиспользование слайсов.

    • Блокировки на мьютексах - заменяю на атомики или RWMutex.

    • Медленные запросы к БД - добавляю индексы или кэширование (Redis).

    • Сетевые таймауты - проверяю настройки http.Client (Timeout, MaxIdleConns).

Пример: если p99 latency вырос, я сначала смотрю на CPU профиль - если там много runtime.mallocgc, значит проблема в аллокациях. Если CPU низкий, а latency высокий - ищу блокировки через block профиль или проверяю трейсы на ожидание ответа от БД.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью