encoder крутит бесконечный цикл, и всё же его доля держится около 50 %. Так работает ключ --cpus.
--cpus 0.5 — квота процессорного времени: за каждую секунду процессы контейнера получают не больше половины секунды работы одного ядра. Использовал свою долю — процесс ждёт следующего отрезка. На машине урока одно ядро, поэтому encoder и держится у 50 %. В docker inspect квота хранится в миллиардных долях ядра: .HostConfig.NanoCpus у encoder — 500000000.
Процессор можно дать процессу позже, а занятую память у него не отберёшь, не сломав его работу. Поэтому за перерасход памяти процесс завершают, а за процессор — заставляют ждать.
Сжатие видео в контейнере с --cpus 0.25 заняло бы ядро целиком. Что покажут docker ps и docker stats через минуту?
-
За процессор ядро не убивает: процесс ждёт своей доли и работает медленнее. Завершает оно за перерасход памяти.
-
Квота
--cpusдействует и на свободной машине: encoder с--cpus 0.5держался у 50 %, хотя других задач у процессора не было.
Квота --cpus ограничивает долю процессорного времени: процесс использует её и ждёт следующего отрезка. Контейнер работает дальше, а docker stats показывает около 25 %.
Главное в шаге
-
docker stats --no-stream— снимок потребления: доля процессора, память и её потолок по каждому контейнеру. -
Без
--memoryпотолок — вся память машины, и нехватка ударит по любому процессу на ней. -
--cpusограничивает долю процессорного времени: процесс работает медленнее и продолжает работать.