Почему ресурсоемкие задачи начинают тормозить на Micro-инстансах в облаке?

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

Ответ

Micro-инстансы (например, t2.micro в AWS, f1-micro в GCP, B1s в Azure) имеют крайне ограниченные и, что важно, базовые (burstable) вычислительные ресурсы, что делает их непригодными для стабильной работы с ресурсоемкими задачами. Основные причины просадок производительности:

  1. Ограничения CPU (CPU Credits/ Burstable Performance): У Micro-инстансов нет гарантированной постоянной производительности CPU. Они работают на основе системы "кредитов". Пока инстанс простаивает, он накапливает кредиты, а при нагрузке — тратит. Как только кредиты заканчиваются, производительность CPU резко падает до базового низкого уровня (например, до 5-10% от ядра). Задача, требующая постоянных вычислений (сборка, кодирование, обработка данных), быстро исчерпывает кредиты и начинает "тормозить".

  2. Нехватка оперативной памяти (RAM): Обычно 1 ГБ или меньше. При нехватке памяти система активно использует своппинг на диск (который на таких инстансах, как правило, сетевой и небыстрый). Это приводит к лавинообразному падению производительности ("thrashing").

  3. Сетевые и дисковые ограничения: Пропускная способность сети и дискового ввода-вывода (IOPS/throughput) на Micro-инстансах также лимитирована и может стать узким местом для задач, активно работающих с данными.

Диагностика на примере AWS t2.micro:

# Мониторинг CPU Credits в CloudWatch (через AWS CLI)
$ aws cloudwatch get-metric-statistics 
  --namespace AWS/EC2 
  --metric-name CPUCreditBalance 
  --dimensions Name=InstanceId,Value=i-1234567890abcdef0 
  --start-time $(date -u -v-1H +%Y-%m-%dT%H:%M:%SZ) 
  --end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) 
  --period 300 --statistics Average

# Мониторинг памяти на самом инстансе
$ free -h
$ cat /proc/meminfo | grep -E "^(MemTotal|MemFree|SwapCached)"

Рекомендации для DevOps:

  • Выбор инстанса: Для рабочих нагрузок с постоянной нагрузкой выбирайте инстансы фиксированной производительности (например, m5.large, c5.xlarge), а не burstable.
  • Автомасштабирование: Используйте группы автомасштабирования (Auto Scaling Groups) для обработки пиковых нагрузок, а не пытайтесь "впихнуть" все в один микро-инстанс.
  • Оптимизация: Для фоновых задач (например, cron-джобы) можно использовать Micro-инстансы, но необходимо тщательно контролировать их потребление через мониторинг (Prometheus + Node Exporter) и алертинг.