Назад к вопросам
Middle
68
questionbank
Как в Docker организовано ограничение ресурсов?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Ограничения ресурсов в Docker реализуются с помощью Cgroups (Control groups), механизма ядра Linux, который позволяет организовать процессы в иерархические группы и распределять между ними системные ресурсы (CPU, RAM, I/O, пропускная способность сети).
Основные типы ограничений:
- CPU:
cpu_shares: Устанавливает относительный вес для доступа к CPU. При наличии свободных ресурсов контейнер может использовать больше, чем его share.cpu_quota/cpu_period: Определяет жесткие лимиты на использование CPU.cpu_periodзадает период времени (в микросекундах), аcpu_quota— максимальное количество микросекунд CPU, которое контейнер может использовать в течение этого периода.cpuset_cpus: Определяет, на каких ядрах CPU разрешено выполняться процессу контейнера.cpuset_mems: Определяет, из каких узлов NUMA разрешено использовать память.
- Memory:
memory: Устанавливает жесткое ограничение на объем RAM, доступный контейнеру. При превышении лимита процессы могут быть остановлены ядром (OOM Killer).memory_swap: Определяет лимит на суммарный объем RAM и swap-памяти.memory_swappiness: Настраивает, насколько агрессивно ядро будет выгружать страницы памяти контейнера в swap.
- Block I/O:
blkio_weight: Устанавливает относительный вес для доступа к блочным устройствам (диску).blkio_read_bps/blkio_write_bps: Задает ограничение на скорость чтения/записи с/на блочное устройство в байтах в секунду.blkio_read_iops/blkio_write_iops: Задает ограничение на количество операций чтения/записи IOPS с/на блочное устройство.
- Network:
- Ограничения пропускной способности сети напрямую не реализуются встроенными средствами Docker Cgroups. Для этого обычно используют инструменты уровня хоста, такие как
tc(traffic control), или сторонние решения.
- Ограничения пропускной способности сети напрямую не реализуются встроенными средствами Docker Cgroups. Для этого обычно используют инструменты уровня хоста, такие как
Docker использует флаги в команде docker run для настройки этих ограничений,F которые затем транслируются в соответствующие параметры Cgroups в файловой системе /sys/fs/cgroup/.
Примеры флагов:
# Ограничение памяти до 512MB и CPU на 50% от одного ядра (если period = 100ms, quota = 50ms)
docker run -m 512m --cpu-quota=50000 --cpu-period=100000 <образ>
# Ограничение использования только ядер 0 и 1
docker run --cpuset-cpus="0,1" <образ>
# Ограничение скорости записи на блочное устройство /dev/sda до 10MB/s
docker run --device-write-bps /dev/sda:10MB <образ>