Как выделить 50% ресурсов ЦП для контейнера Docker через "Docker Run"?
У меня 4-ядерный процессор, я хочу выделить 50% ресурсов процессора для контейнера докеров.
После прочтения руководства docker-run
и config.go
.
Я до сих пор не знаю, как использовать параметр -c, --cpu-shares=0
.
docker run -c 0.5 -i -t ubuntu /bin/bash
или
docker run -c 2 -i -t ubuntu /bin/bash
Ответы
Ответ 1
cpu-shares - это "относительный вес" по отношению к настройке по умолчанию 1024, поэтому, если у вас было два контейнера, работающих на одном ядре, вы могли бы дать им ЦП 50-50 или 80-20 или что угодно, отрегулировав номера. Это целое число.
Вы не можете дать общее ограничение, как вы хотите, используя этот флаг, но вы можете ограничить набор процессоров, на которых работает контейнер, используя --cpuset
упомянутый здесь.
Номер 1024 находится в документации Cgroups.
Этот пост в блоге от Марека Голдманна объясняет управление ресурсами в Docker.
Смотрите также Установка абсолютных ограничений на ЦП для контейнеров Docker, где говорится, что это можно сделать с помощью lxc (более старая реализация Docker), но не libcontainer (текущая реализация Docker).
Ответ 2
Это зависит от окружающей среды, поэтому нет прямого ответа, но продолжайте читать.
Из docker run --help
:
-c, --cpu-shares=0 CPU shares (relative weight)
Так как Docker основан на cgroups. ЦП будет распределен среди запущенных контейнеров. По умолчанию значение равно 1024
.
cat /sys/fs/cgroup/cpu/docker/cpu.shares
1024
Итак, если у нас есть 2 контейнера, один для базы данных и еще один для веб-сервера
sudo docker run -c 614 -dit --name db postgres /postgres.sh
sudo docker run -c 410 -dit --name web nginx /nginx.sh
Отдаст 60% контейнеру db
(614 - 60% от 1024) и 40% - web
контейнеру.
Для дальнейшего чтения смотрите:
Ответ 3
Примечание: PR 15078 реализует (декабрь 2015 г.) поддержку для изменения ресурсов (включая ЦП) как для остановленного, так и для запущенного контейнера (возможно, Docker 1.10 или 1.11)
Мы решили разрешить устанавливать то, что мы называем ресурсами, которые на данный момент состоят из штук cgroup, отсюда и следующий PR # 18073.
Единственные разрешенные изменяемые элементы контейнера находятся в HostConfig и точно в Ресурсах (см. Структуру).
resources := runconfig.Resources{
BlkioWeight: *flBlkioWeight,
CpusetCpus: *flCpusetCpus, <====
CpusetMems: *flCpusetMems, <====
CPUShares: *flCPUShares, <====
Memory: flMemory,
MemoryReservation: memoryReservation,
MemorySwap: memorySwap,
KernelMemory: kernelMemory,
CPUPeriod: *flCPUPeriod,
CPUQuota: *flCPUQuota,
}
- Команда должна быть
set
. - Разрешенные изменения передаются в виде флагов: например,
--memory=1Gb --cpushare=…
(как это делает PR). - Существует один флаг для каждого атрибута структуры
Resources
(и не больше, не меньше).
Обратите внимание, что внесение изменений с помощью docker set
должно сохраняться.
Т.е. эти изменения будут постоянными (обновляется в контейнере JSON)
Проверьте также последний (июль 2019 г., 4 года спустя) openJDK 8u212 (или более поздний), в котором есть официальная поддержка Docker.
Ответ 4
Так как Docker 1.13, на вашем 4-ядерном компьютере просто добавьте docker container run --cpus 2.0 [args...]
.
Объяснение из это сообщение в блоге:
В 1.13, хотя, если вы хотите, чтобы контейнер был ограничен одним процессором, вы можете просто добавить --cpus 1.0
в свою командную строку запуска/создания Docker. Если вы хотите использовать два с половиной процессора в качестве предела контейнера, просто добавьте --cpus 2.5
. В Docker мы используем квоту CFS и период, чтобы ограничить использование cpu контейнеров тем, что вы хотите, и выполнять вычисления для вас.
Также проверить документы.
Ответ 5
Посмотрите здесь, это, по-видимому, то, что вы искали:
https://docs.docker.com/engine/reference/run/#cpu-period-constraint
Период CPU CFS (полностью справедливый планировщик) по умолчанию составляет 100 мс. Мы можем использовать --cpu-period для установки периода использования ЦП для ограничения использования ЦП контейнеров. И обычно --cpu-период должен работать с -cpu-quota.
Примеры:
$ docker run -it --cpu-period=50000 --cpu-quota=25000 ubuntu:14.04 /bin/bash
Если есть 1 процессор, это означает, что контейнер может получить 50% производительности процессора каждые 50 мс.
определение периода и квоты:
В
каждый заданный "период" (микросекунды), группе разрешено потреблять только до
"квота" микросекунд времени процессора. Когда потребление пропускной способности ЦП
группа превышает этот предел (за этот период), задачи, принадлежащие его
иерархия будет дросселирована и не разрешается запускаться снова до следующего
период.