Linux Labs

Контейнеры: Docker и compose / Ступень 10 из 11

Лимиты, OOMKilled и пользователь в контейнере

Не запущена Запускается обычно ~20 с
Выйти из урока

Шаг 4 из 9 · теория · 4 мин

Квота процессора

encoder крутит бесконечный цикл, и всё же его доля держится около 50 %. Так работает ключ --cpus.

--cpus 0.5 — квота процессорного времени: за каждую секунду процессы контейнера получают не больше половины секунды работы одного ядра. Использовал свою долю — процесс ждёт следующего отрезка. На машине урока одно ядро, поэтому encoder и держится у 50 %. В docker inspect квота хранится в миллиардных долях ядра: .HostConfig.NanoCpus у encoder — 500000000.

Процессор можно дать процессу позже, а занятую память у него не отберёшь, не сломав его работу. Поэтому за перерасход памяти процесс завершают, а за процессор — заставляют ждать.

Проверь себя 1 вопрос

Сжатие видео в контейнере с --cpus 0.25 заняло бы ядро целиком. Что покажут docker ps и docker stats через минуту?

  • За процессор ядро не убивает: процесс ждёт своей доли и работает медленнее. Завершает оно за перерасход памяти.

  • Квота --cpus действует и на свободной машине: encoder с --cpus 0.5 держался у 50 %, хотя других задач у процессора не было.

Квота --cpus ограничивает долю процессорного времени: процесс использует её и ждёт следующего отрезка. Контейнер работает дальше, а docker stats показывает около 25 %.

Главное в шаге

  • docker stats --no-stream — снимок потребления: доля процессора, память и её потолок по каждому контейнеру.
  • Без --memory потолок — вся память машины, и нехватка ударит по любому процессу на ней.
  • --cpus ограничивает долю процессорного времени: процесс работает медленнее и продолжает работать.
Ubuntu 24.04
Загрузка…