Ответ
Контейнер не будет завершен, но его производительность будет искусственно ограничена. Ядро 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% одного ядра.
Практические последствия для разработки и эксплуатации:
- Производительность: Приложение в контейнере будет работать медленнее под нагрузкой. Это особенно критично для CPU-intensive задач (обработка данных, компиляция, шифрование).
- Метрики и троттлинг: В статистике Docker (
docker stats) и в более продвинутых системах мониторинга (cAdvisor + Prometheus) можно отслеживать метрикуthrottling_timeилиthrottled_time. Ее рост — прямой индикатор того, что контейнеру не хватает выделенной CPU квоты. - Настройка в продакшене: В отличие от памяти, CPU — "сжимаемый" ресурс. Часто
limits.cpuв Kubernetes ставят вышеrequests.cpu, чтобы позволить приложению "всплесками" использовать больше ресурсов в периоды пиковой нагрузки, не сталкиваясь с троттлингом при каждом небольшом превышении. - Диагностика: Если приложение "тормозит", но не падает, проверьте лимиты CPU и наличие троттлинга в первую очередь.