Как диагностировать и отлаживать проблемы с производительностью сервиса?
Что проверяют
Есть ли у вас метод, а не набор инструментов. Интервьюер хочет услышать, как вы от симптома «сервис тормозит» доходите до конкретного ресурса или запроса. Следом обычно дают сценарий: p99 вырос вдвое после релиза, CPU при этом в норме, ваши действия.
Как отвечать
Сначала уточните симптом: что деградировало (задержка, пропускная способность, ошибки), у всех или у части пользователей, с какого момента. Сразу проверьте, что менялось: деплой, конфиг, трафик, соседние сервисы.
Дальше двигайтесь сверху вниз:
- RED для сервиса: rate, errors, duration по эндпоинтам в Prometheus и Grafana, смотрите перцентили p95 и p99, а не среднее;
- трассировка: OpenTelemetry с Jaeger или Tempo показывает, где уходит время: в своём коде, в базе, во внешнем API, в DNS;
- USE для ресурсов: утилизация, насыщение и ошибки по CPU, памяти, диску и сети. На хосте это
vmstat,iostat -x,pidstat,ss -s,dmesgна предмет OOM killer; - Kubernetes: троттлинг CPU из-за лимитов (
container_cpu_cfs_throttled_periods_total), рестарты сOOMKilled, неудачное размещение подов; - профилирование:
perfи flame graph, eBPF-инструменты вродеbpftrace, для приложений pprof, async-profiler, py-spy; - база:
pg_stat_statements, лог медленных запросов, блокировки, исчерпание пула соединений.
Гипотезу подтверждайте воспроизведением под нагрузкой (k6, JMeter, Gatling), а исправление проверяйте теми же метриками. Итог закрепите алертом и разбором инцидента.
Где спотыкаются
Сразу масштабируют: добавляют реплики или ресурсы, не найдя узкое место. Если упираетесь в базу или блокировку, новые поды только удлинят очередь.
Смотрят на среднюю задержку. Среднее скрывает хвост, а жалуются как раз те, чьи запросы попали в p95 и выше.
Видят низкую загрузку CPU в контейнере и исключают процессор. При лимите многопоточное приложение может выбрать всю квоту в начале каждого 100-миллисекундного периода CFS и простаивать до следующего, хотя средняя загрузка выглядит скромной. Видно это только по метрикам троттлинга.