Ограничение ресурсов контейнеров: CPU Quota, Shares, Memory и I/O Throttling
- Один контейнер утилизирует 100% всех ядер процессора (CPU Starvation) или всю память хоста.
- Зависание операций дискового ввода-вывода из-за генерации интенсивного I/O одним сервисом.
- Падение соседних системных демонов и сервисов на одном сервере.
1. Ограничение процессорных ресурсов (CPU)
# Выделение строго 1.5 ядер CPU (CFS Quota)
docker run -d --name app_cpu --cpus="1.5" my_image
# Привязка к конкретным ядрам CPU (Core Pinning)
docker run -d --name app_pinned --cpuset-cpus="0,1" my_image
# Установка относительного приоритета CPU (CPU Shares, дефолт 1024)
docker run -d --name app_low_pri --cpu-shares=512 my_image2. Ограничение дискового ввода-вывода (Block I/O Throttling)
# Ограничение скорости записи на устройство /dev/sda до 10MB/s
docker run -d --name app_io \
--device-write-bps /dev/sda:10mb \
--device-read-bps /dev/sda:20mb \
my_image3. Комплексная конфигурация ресурсов в Docker Compose
services:
backend:
image: app:v1
deploy:
resources:
limits:
cpus: '2.0'
memory: 4096M
reservations:
cpus: '0.5'
memory: 1024M4. Проверка ограничений в работающем контейнере
docker exec -it app_cpu cat /sys/fs/cgroup/cpu.max Частые вопросы (FAQ)
В чем разница между --cpus и --cpu-shares?
--cpus задает жесткий потолок утилизации CPU (через CFS Quota). --cpu-shares задает относительный вес процесса при дефиците ресурсов, но позволяет использовать 100% свободного CPU при отсутствии конкуренции.
Как cpus='1.5' транслируется на уровне ядра Linux?
Через параметры cpu.cfs_quota_us (150000) и cpu.cfs_period_us (100000). За период 100 мс контейнер может суммарно выполняться 150 мс на всех ядрах.