Что произойдет с контейнером, если будет превышен лимит по CPU

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

Ответ

Контейнер не будет завершен, но его производительность будет искусственно ограничена. Ядро Linux (через механизм контрольных групп — cgroups) начнет "троттлировать" (throttle) процессы контейнера, не давая им использовать CPU сверх выделенного лимита.

Как это работает: Допустим, контейнеру выделено --cpus=0.5 (половина ядра). Если процессы в контейнере в какой-то момент попытаются загрузить CPU на 100% одного ядра, планировщик задач ядра будет приостанавливать их выполнение, чтобы в среднем за период времени использование не превышало 50% одного ядра. Это приводит к увеличению времени отклика (latency).

Пример и наблюдение:

# Запуск контейнера с ограничением CPU
docker run -d --name stress-test --cpus="0.5" alpine:latest sh -c "while true; do :; done"

# Мониторинг использования CPU контейнера
docker stats stress-test
# Вывод покажет, что `CPU %` будет колебаться, но в среднем не превысит 50% одного ядра.

Практические последствия для разработки и эксплуатации:

  1. Производительность: Приложение в контейнере будет работать медленнее под нагрузкой. Это особенно критично для CPU-intensive задач (обработка данных, компиляция, шифрование).
  2. Метрики и троттлинг: В статистике Docker (docker stats) и в более продвинутых системах мониторинга (cAdvisor + Prometheus) можно отслеживать метрику throttling_time или throttled_time. Ее рост — прямой индикатор того, что контейнеру не хватает выделенной CPU квоты.
  3. Настройка в продакшене: В отличие от памяти, CPU — "сжимаемый" ресурс. Часто limits.cpu в Kubernetes ставят выше requests.cpu, чтобы позволить приложению "всплесками" использовать больше ресурсов в периоды пиковой нагрузки, не сталкиваясь с троттлингом при каждом небольшом превышении.
  4. Диагностика: Если приложение "тормозит", но не падает, проверьте лимиты CPU и наличие троттлинга в первую очередь.