← До програми курсу

Модуль 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 не бачить усю зовнішню нагрузку OS, тому потрібен експлуатаційний запас.

03

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

Limit задає cgroup ceiling. CPU limit обмежує процесор, memory limit призводить до OOM kill. 128 MiB allocation за 32 MiB limit дала exit 137.

Exit 137 означає SIGKILL, але без inspect, kernel log і metrics не доводить OOM.

04

4. Місткість і N−1

Кожен node повідомляє 4 CPU і 6207012864 байт RAM. Для чотирьох reservations по 4 GiB доступні лише три slots.

N−1 вимагає розмістити workload на двох nodes із запасом для OS, Engine, updates і сплесків. Reservations визначають admission.

05

5. Методичні вказівки

  • Вимірюйте allocatable і baseline
  • Reservation задавайте за сталим мінімумом
  • Limit перевіряйте тестом
  • OOM запускайте з restart none
  • Не створюйте pressure на кількох nodes
  • Чекайте завершення 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 та 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. Після update сервіс досягне 4/4.

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 — memory investigation
  • CPU throttling — latency без kill
  • host pressure — OS та сусідні workloads
10

10. Контроль, критерії засвоєння та cleanup

  • Reservation виділяє RAM наперед?
  • Що обмежує limit?
  • Чому 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