← К программе курса

Модуль 14 / 24

Limits, reservations и ёмкость

DOCKER SWARM

Содержание
01

1. Цели и результат модуля

После модуля вы сможете различать reservations и limits, объяснять scheduler capacity, распознавать OOM и рассчитывать N−1 headroom.

  • резервировать CPU/RAM для placement
  • ограничивать runtime consumption
  • диагностировать insufficient resources
  • интерпретировать exit 137
02

2. Теория: reservations

Reservation сообщает scheduler минимальную ёмкость task. Она вычитается из планируемых ресурсов node, даже если процесс фактически их не использует. Это admission model, а не предварительное выделение RAM.

Scheduler учитывает reservations Swarm services, но не всю внешнюю нагрузку OS и standalone containers. Поэтому эксплуатационный запас обязателен.

03

3. Теория: limits и OOM

Limit задаёт cgroup ceiling выполнения. CPU limit ограничивает долю процессора, memory limit приводит к OOM kill при невозможности удовлетворить allocation. В лаборатории 128 MiB allocation при 32 MiB limit дала exit 137.

Exit 137 означает SIGKILL, но не доказывает OOM без inspect, kernel log и метрик: container мог быть убит оператором.

04

4. Ёмкость и N−1

Каждый node сообщает 4 CPU и 6207012864 байт RAM. Для четырёх reservations по 4 GiB доступны только три slots — по одному на node.

N−1 планирование требует разместить критичный workload на двух оставшихся nodes с запасом для OS, Engine, updates и всплесков. Сумма limits может превышать физическую RAM; сумма reservations определяет admission.

05

5. Методические указания

  • Сначала измеряйте allocatable и baseline
  • Reservation задавайте по устойчивому минимуму
  • Limit проверяйте нагрузочным тестом
  • OOM запускайте один раз с restart none
  • Не создавайте memory pressure на нескольких nodes
  • После изменения ждите последовательного service update
06

6. Лабораторная работа: исходная ёмкость

Зафиксируйте advertised resources и фактическую текущую нагрузку. Значения scheduler и free в OS отвечают на разные вопросы.

terminal
ssh swarm-manager-3 docker node inspect swarm-manager-1 swarm-manager-2 swarm-manager-3 --format '{{.Description.Hostname}} cpus={{.Description.Resources.NanoCPUs}} memory={{.Description.Resources.MemoryBytes}}'
ssh swarm-manager-3 docker stats --no-stream
07

7. Лабораторная работа: Pending по ёмкости

Четыре tasks резервируют по 4 GiB. Ожидаются 3/4 и no suitable node: insufficient resources on 3 nodes; процессы sleep почти не расходуют RAM.

terminal
ssh swarm-manager-3 docker service create --detach=true --name swarm-m14-reserved --replicas 4 --reserve-memory 4G --limit-memory 5120M alpine:3.22 sleep 3600
ssh swarm-manager-3 docker service ps swarm-m14-reserved --no-trunc
ssh swarm-manager-3 docker service inspect swarm-m14-reserved --pretty
08

8. Лабораторная работа: изменение бюджета

Снизьте reservation до 1 GiB и limit до 2 GiB. После rolling update сервис должен достичь 4/4; несколько tasks могут оказаться на одном node.

terminal
ssh swarm-manager-3 docker service update --detach=false --reserve-memory 1G --limit-memory 2G swarm-m14-reserved
ssh swarm-manager-3 docker service ps swarm-m14-reserved
09

9. OOM и диагностика

Одноразовый task на manager-1 пытается выделить 128 MiB при limit 32 MiB. Ожидаются Failed и exit 137 без restart loop.

terminal
ssh swarm-manager-3 docker service create --detach=true --name swarm-m14-oom --replicas 1 --constraint node.hostname==swarm-manager-1 --limit-memory 32M --restart-condition none python:3.13-alpine python -c 'a=bytearray(128*1024*1024);print(len(a))'
ssh swarm-manager-3 docker service ps swarm-m14-oom --no-trunc
ssh swarm-manager-1 docker ps -a --filter label=com.docker.swarm.service.name=swarm-m14-oom
terminal
ssh swarm-manager-3 docker service inspect swarm-m14-reserved --pretty
ssh swarm-manager-3 docker service ps swarm-m14-reserved --no-trunc
ssh swarm-manager-1 docker inspect $(ssh swarm-manager-1 docker ps -aq --filter label=com.docker.swarm.service.name=swarm-m14-oom)
ssh swarm-manager-1 journalctl -u docker --since today
  • Pending — scheduler/reservation
  • OOMKilled или 137 — runtime memory investigation
  • CPU throttling — latency растёт без kill
  • host pressure — проверяйте OS и соседние workloads
10

10. Контроль, критерии освоения и cleanup

  • Reservation выделяет RAM заранее?
  • Что ограничивает limit?
  • Почему exit 137 не всегда OOM?
  • Что определяет admission?
  • Как считать N−1?
  • Почему limits нельзя суммировать как гарантии?

Модуль освоен, если вы воспроизводите 3/4 Pending без нагрузки, исправляете budget и безопасно подтверждаете OOM.

terminal
ssh swarm-manager-3 docker service rm swarm-m14-reserved swarm-m14-oom
ssh swarm-manager-3 docker service ls
ssh swarm-manager-3 docker node ls