Смешивание ресурсов процессора и набора процессоров в Docker

Я хотел бы запустить два контейнера со следующим распределением ресурсов:

  • Контейнер "C1": зарезервированный cpu1, общий cpu2 с 20 долями cpu
  • Контейнер "C2": зарезервированный cpu3, ​​общий cpu2 с 80 долями cpu

Если я запускаю два контейнера таким образом:

docker run -d --name='C1' --cpu-shares=20 --cpuset-cpus="1,2" progrium/stress --cpu 2

docker run -d --name='C2' --cpu-shares=80 --cpuset-cpus="2,3" progrium/stress --cpu 2

Я понял, что C1 занимает 100% процессора 1, как и ожидалось, но 50% процессора 2 (вместо 20%), C2 занимает 100% процессора 3, как и ожидалось, и 50% процессора 2 (вместо 80%).

Похоже, параметр --cpu-shares игнорируется. Есть ли способ получить поведение, которое я ищу?


person Giovanni Quattrocchi    schedule 08.01.2016    source источник


Ответы (1)


docker run упоминает этот параметр как:

--cpu-shares=0                CPU shares (relative weight)

И contrib/completion/zsh/_docker#L452 включает:

"($help)--cpu-shares=[CPU shares (relative weight)]:CPU shares:(0 10 100 200 500 800 1000)"

Таким образом, эти значения не основаны на процентах.

В OP упоминается, что --cpu-shares=20/80 работает со следующими ограничениями CPUset:

 docker run -ti --cpuset-cpus="0,1" C1 # instead of 1,2
 docker run -ti --cpuset-cpus="3,4" C2 # instead of 2,3

(эти значения проверяются/проверяются только с версии docker 1.9.1 с PR 16159)

Примечание. Существует также ограничение квоты ЦП:

Флаг --cpu-quota ограничивает использование ЦП контейнера. Значение по умолчанию 0 позволяет контейнеру использовать 100% ресурса ЦП (1 ЦП).

person VonC    schedule 08.01.2016
comment
Я знаю, я использовал 20 и 80, чтобы упростить сценарий. Поскольку у меня есть только два контейнера, которым требуется 100 % загрузки процессора (нагрузка) с общими ресурсами, установленными на 20 и 80, они должны работать на 20 % и 80 % соответственно на общем процессоре (cpu2). Конечно, я мог бы использовать что-то вроде 4 и 16 или 80 и 320. - person Giovanni Quattrocchi; 08.01.2016
comment
Нет, я имею в виду, что эти значения могут быть не распознаны. Попробуйте 200 и 800, чтобы увидеть, работает ли это лучше. - person VonC; 08.01.2016
comment
@GiovanniQuattrocchi, а если поменять местами значения? (800 и 200 вместо 200 и 800) - person VonC; 08.01.2016
comment
Я не знаю почему, но если использовать cpuset-cpus=0,1 для C1 и cpuset-cpus=1,2 для C2, я получил ожидаемое поведение... - person Giovanni Quattrocchi; 08.01.2016
comment
@GiovanniQuattrocchi Какую версию докера вы используете? - person VonC; 11.01.2016