Какие ваши действия, если приложение в продакшене потребляет слишком много оперативной памяти?

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

Ответ

Первым делом я смотрю на дашборды в Grafana, подключенные к Prometheus, чтобы определить масштаб проблемы: это внезапный скачок или постепенный рост (утечка). Ключевые метрики — container_memory_working_set_bytes и container_memory_usage_bytes для контейнеров или process_resident_memory_bytes для процессов.

Далее я анализирую логи в централизованной системе, например, в ELK-стеке или Grafana Loki, ищу ошибки OutOfMemoryError или предупреждения от сборщика мусора (GC).

Если проблема неочевидна, подключаю профилировщик. Для Java-приложений использую jcmd <pid> GC.heap_dump для создания дампа и анализирую его в Eclipse MAT или VisualVM. Для Go — pprof с эндпоинта /debug/pprof/heap.

Немедленные действия в оркестраторе:

# В манифесте Pod в Kubernetes устанавливаю/корректирую лимиты
spec:
  containers:
  - name: app
    resources:
      requests:
        memory: "512Mi"
      limits:
        memory: "1Gi"

Параллельно проверяю, не исчерпаны ли квоты на namespace (kubectl describe resourcequota).

Поиск причины в коде/конфигурации:

  • Проверяю настройки кэшей (например, в Redis или in-memory кэше приложения) на наличие неограниченного TTL.
  • Ищу утечки в соединениях с БД или внешними API, которые не закрываются в finally-блоке.
  • Анализирую, не загружаются ли в память большие файлы или datasets целиком вместо потоковой обработки.

Если проблема в высокой нагрузке, рассматриваю горизонтальное масштабирование (увеличение реплик) и настройку HPA на основе потребления памяти.