Как оцениваешь ресурсоемкость приложения или инфраструктурного компонента?

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

Ответ

Оценка ресурсоёмкости — это комплексный процесс, который я выстраиваю по нескольким уровням:

1. Базовый мониторинг и метрики: Использую стек Prometheus/Grafana для сбора ключевых метрик:

  • CPU: rate(process_cpu_seconds_total[5m]) — утилизация.
  • Память: container_memory_working_set_bytes — реальное потребление в Kubernetes.
  • Диск I/O: rate(node_disk_read_bytes_total[5m]).
  • Сеть: rate(node_network_receive_bytes_total[5m]).

2. Профилирование под нагрузкой:

  • Для приложений: Запускаю нагрузочное тестирование (например, с помощью k6 или Locust) и одновременно профилирую приложение. Для Go-сервисов — pprof, для Java — async-profiler.
  • Для инфраструктуры: Тестирую пределы с помощью stress-ng или специальных утилит (например, fio для дисков).

3. Анализ в Kubernetes:

# Смотрю реальное потребление против лимитов
kubectl top pods --containers -n <namespace>

# Анализирую, какие поды чаще всего перезапускаются (признак OOM)
kubectl get pods -n <namespace> --sort-by='.status.containerStatuses[0].restartCount'

4. Практический пример — поиск утечки памяти: Допустим, под в K8s постоянно падает с OOM. Мои действия:

  1. Смотрю график памяти в Grafana: растёт ли потребление постоянно или ступенчато?
  2. Подключаюсь к поду и снимаю профиль кучи (если это JVM, то jmap -dump:live,file=/tmp/heap.hprof <pid>).
  3. Анализирую дамп с помощью Eclipse MAT или jhat, чтобы найти retainers крупнейших объектов.
  4. Частой причиной в DevOps-контексте бывают кэши без TTL или не закрытые соединения с БД/брокерами сообщений.

Ключевой принцип: оцениваю не только текущее потребление, но и тренды, а также поведение системы в условиях пиковой нагрузки и деградации.