Модуль 14 / 24
Limits, reservations и ёмкость
Содержание
1. Цели и результат модуля
После модуля вы сможете различать reservations и limits, объяснять scheduler capacity, распознавать OOM и рассчитывать N−1 headroom.
- резервировать CPU/RAM для placement
- ограничивать runtime consumption
- диагностировать insufficient resources
- интерпретировать exit 137
2. Теория: reservations
Reservation сообщает scheduler минимальную ёмкость task. Она вычитается из планируемых ресурсов node, даже если процесс фактически их не использует. Это admission model, а не предварительное выделение RAM.
Scheduler учитывает reservations Swarm services, но не всю внешнюю нагрузку OS и standalone containers. Поэтому эксплуатационный запас обязателен.
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 мог быть убит оператором.
4. Ёмкость и N−1
Каждый node сообщает 4 CPU и 6207012864 байт RAM. Для четырёх reservations по 4 GiB доступны только три slots — по одному на node.
N−1 планирование требует разместить критичный workload на двух оставшихся nodes с запасом для OS, Engine, updates и всплесков. Сумма limits может превышать физическую RAM; сумма reservations определяет admission.
5. Методические указания
- Сначала измеряйте allocatable и baseline
- Reservation задавайте по устойчивому минимуму
- Limit проверяйте нагрузочным тестом
- OOM запускайте один раз с restart none
- Не создавайте memory pressure на нескольких nodes
- После изменения ждите последовательного service update
6. Лабораторная работа: исходная ёмкость
Зафиксируйте advertised resources и фактическую текущую нагрузку. Значения scheduler и free в OS отвечают на разные вопросы.
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-stream7. Лабораторная работа: Pending по ёмкости
Четыре tasks резервируют по 4 GiB. Ожидаются 3/4 и no suitable node: insufficient resources on 3 nodes; процессы sleep почти не расходуют RAM.
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 --pretty8. Лабораторная работа: изменение бюджета
Снизьте reservation до 1 GiB и limit до 2 GiB. После rolling update сервис должен достичь 4/4; несколько tasks могут оказаться на одном node.
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-reserved9. OOM и диагностика
Одноразовый task на manager-1 пытается выделить 128 MiB при limit 32 MiB. Ожидаются Failed и exit 137 без restart loop.
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-oomssh 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. Контроль, критерии освоения и cleanup
- Reservation выделяет RAM заранее?
- Что ограничивает limit?
- Почему exit 137 не всегда OOM?
- Что определяет admission?
- Как считать N−1?
- Почему limits нельзя суммировать как гарантии?
Модуль освоен, если вы воспроизводите 3/4 Pending без нагрузки, исправляете budget и безопасно подтверждаете OOM.
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