Назад к вопросам
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 использует флаги в команде 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 <образ>