> Как расследовать проблему медленной работы сервиса и какие метрики и инструменты использовать (Go)
Уровень: senior · Роль: backend · Категория: Технические вопросы
Компании: Т-Банк
Стек: Go
> Пример ответа
При расследовании проблем с производительностью Go-сервиса я действую по следующему плану:
-
Сбор первичных данных - проверяю метрики из Prometheus/Grafana: latency (p50, p95, p99), throughput (RPS), error rate, CPU/memory usage. Если метрик нет, подключаю профилирование через pprof.
-
Локализация узкого места:
-
Использую
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.
-
-
Анализ конкретных метрик:
-
CPU: если высокий - ищу горячие функции (например, неэффективные алгоритмы, частые аллокации).
-
Memory: heap профиль показывает объекты, удерживающие память. Проверяю утечки через
go tool pprof -alloc_spaceи-inuse_space. -
Latency: распределение времени по слоям (БД, внешние API, обработка). Использую распределённый трейсинг (Jaeger/OpenTelemetry).
-
Goroutines:
runtime.NumGoroutine()- если их тысячи, ищу утечки или неэффективные горутины (например, бесконечные каналы).
-
-
Инструменты:
-
pprof- для профилирования CPU, памяти, блокировок. -
trace- для анализа задержек, GC, синхронизации. -
expvar- для кастомных метрик (например, размер очереди, время обработки). -
Prometheus+Grafana- для долгосрочного мониторинга. -
Jaeger- для трейсинга запросов.
-
-
Типичные проблемы в Go:
-
Частые аллокации (GC pressure) - оптимизирую через sync.Pool или переиспользование слайсов.
-
Блокировки на мьютексах - заменяю на атомики или RWMutex.
-
Медленные запросы к БД - добавляю индексы или кэширование (Redis).
-
Сетевые таймауты - проверяю настройки http.Client (Timeout, MaxIdleConns).
-
Пример: если p99 latency вырос, я сначала смотрю на CPU профиль - если там много runtime.mallocgc, значит проблема в аллокациях. Если CPU низкий, а latency высокий - ищу блокировки через block профиль или проверяю трейсы на ожидание ответа от БД.
> Похожие задачи по backend
Где в памяти находится переменная: в хипе или в стеке в Go
Почему важно проверять ошибки при работе с базой данных и маршалингом
Как устроена передача сообщений в gRPC
Что такое protobuf и как он используется в gRPC
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью