Как ищешь причины медленной работы сервиса

«Как ищешь причины медленной работы сервиса» — вопрос из категории Мониторинг и логирование, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Мой подход к поиску причин медленной работы сервиса в DevOps-контексте — это движение от общего к частному, используя данные мониторинга и логи.

  1. Анализ метрик инфраструктуры (USE-методология):

    • Utilization (Использование): Смотрю на загрузку CPU, памяти, дискового I/O и сети на нодах (виртуальных машинах/контейнерах) через Prometheus/Grafana или облачные мониторинги (CloudWatch, Azure Monitor). Ищу узкие места, близкие к 100%.
    • Saturation (Насыщение): Ищу очереди — длину очереди диска (await в iostat), переполнение сетевых буферов, высокий load average при низком использовании CPU (может указывать на ожидание I/O).
    • Errors (Ошибки): Проверяю счетчики сетевых ошибок, ошибок диска, сбоев процессов.
  2. Анализ метрик приложения (RED-методология):

    • Rate (Частота): Количество запросов в секунду.
    • Errors: Количество ошибок.
    • Duration (Длительность): Время отклика (p50, p95, p99). Рост p95/p99 при стабильном p50 часто указывает на проблему с конкретными зависимостями или запросами.
  3. Глубокий дайвинг с помощью трассировок и логов:

    • Распределенная трассировка (Jaeger, Zipkin): Если внедрена, сразу вижу, какой этап запроса (вызов БД, внешнего API, внутреннего микросервиса) занимает больше всего времени.
    • Логи приложения: Фильтрую логи по высокому времени отклика. В веб-приложениях ищу медленные эндпоинты, анализирую стек-трейсы.
    • Логи зависимостей: Проверяю логи базы данных (медленные SQL-запросы), кэша (Redis/Memcached), очередей сообщений (Kafka, RabbitMQ).
  4. Пример для веб-сервиса на K8s:

    # 1. Смотрю метрики пода
    kubectl top pod -n <namespace>
    # 2. Анализирую логи пода с таймстампами
    kubectl logs -f <pod-name> --tail=100 | grep -E "(slow|timeout|error|duration)"
    # 3. Если есть подозрение на сеть, проверяю доступность зависимостей
    kubectl exec -it <pod-name> -- curl -I --connect-timeout 5 <dependency-service-url>
    # 4. Для БД: нахожу медленные запросы (пример для PostgreSQL)
    kubectl exec -it <postgres-pod> -- psql -U user -d db -c "SELECT query, total_time FROM pg_stat_statements ORDER BY total_time DESC LIMIT 5;"

    Основные причины: неоптимальные запросы к БД, нехватка ресурсов у контейнера, сетевые задержки между микросервисами, блокировки (в БД или коде), сборка мусора (GC) в JVM-приложениях.