Каковы ваши первые действия по диагностике, если production-сервис перестал отвечать (завис)?

«Каковы ваши первые действия по диагностике, если production-сервис перестал отвечать (завис)?» — вопрос из категории DevOps, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Диагностика выполняется по принципу «от внешнего к внутреннему», чтобы быстро локализовать проблему.

Алгоритм первоочередных действий:

  1. Быстрая оценка масштаба:

    • Проверить мониторинг (Grafana, CloudWatch) на предмет аномалий в CPU, памяти, дисковом I/O и сетевой активности.
    • Определить, проблема у одного инстанса или у всех.
  2. Сбор диагностических данных (если сервис еще хоть как-то доступен):

    • Логи приложения: Искать ошибки, исключения, предупреждения. Ключевые слова: OutOfMemoryError, deadlock, timeout.
    • Дампы потоков (Thread Dump): Критически важно для поиска взаимных блокировок (deadlock) или «зависших» потоков.
      # Для Java-процесса
      jstack <PID> > thread_dump.txt
      # Или через kill
      kill -3 <PID>
    • Анализ использования памяти (Heap Dump): При подозрении на утечку памяти.
      jmap -dump:live,format=b,file=heap.hprof <PID>
  3. Анализ возможных причин и срочные меры:

    Причина Симптомы Срочное действие
    Утечка памяти (Memory Leak) Постепенный рост потребления памяти (Old Gen), частые GC, в итоге OutOfMemoryError. 1. Снять heap dump.
    2. Перезапустить инстанс (с graceful shutdown, если возможно).
    Взаимная блокировка (Deadlock) Потоки «зависли», время отклика стремится к бесконечности. Видно в thread dump. 1. Анализ thread dump.
    2. Перезапуск.
    Исчерпание ресурсов (CPU, I/O) 100% загрузка CPU или диска, высокий load average. 1. top -Hp <PID> для поиска «горячих» потоков.
    2. iostat для анализа диска.
    3. Остановка наиболее ресурсоемкой операции.
    Проблемы с внешними зависимостями (БД, кэш, API) Множество блокированных потоков в ожидании ответа от сети. Таймауты в логах. 1. Проверить доступность зависимостей.
    2. Временно увеличить таймауты или включить circuit breaker.
  4. Профилактика для будущего:

    • Настройка лимитов ресурсов (CPU, memory) на уровне контейнера (Docker) или оркестратора (Kubernetes).
    • Внедрение health-check эндпоинтов (/actuator/health).
    • Настройка алертов в мониторинге на ключевые метрики (высокий CPU, рост памяти, ошибки 5xx).
    • Использование таймаутов и bulkheads в сетевых вызовах (Resilience4j, Hystrix).