Подтвердить что ты не робот

Как докеры используют ядра ЦП от своей операционной системы?

Мое недопонимание, основанное на том, что Docker основано на LXC, заключается в том, что контейнеры Docker совместно используют различные ресурсы из своей операционной системы хоста. Моя проблема связана с ядрами CPU. Вот сценарий:

  • операционная система хоста имеет 8 ядер
  • Мне нужно развернуть набор контейнеров докеров на ОС хоста выше.
  • Некоторые из контейнеров докеров, которые мне нужно развернуть, лучше подходят для использования 2 ядер

a) Итак, если я запустил все контейнеры докеров на этом хосте, они будут потреблять CPU/ядра по мере необходимости, как если бы они запускались как обычные установленные приложения на этой ОС хоста?

b) Будет ли контейнер докеров потреблять свой собственный процесс, и вся содержащаяся в нем обработка будет зависеть от этого основного ядра процессора?

c) Как я могу указать контейнер докера для использования нескольких ядер (например, 4). Я видел, что есть флаг -C, который может указывать на идентификатор ядра, но, похоже, нет возможности указать контейнер для выбора N ядер в случайном порядке.

4b9b3361

Ответ 1

В настоящее время я не думаю, что докер обеспечивает такой уровень детализации. Он не определяет, сколько ядер он выделяет в своих файлах lxc.conf, поэтому вы получите все ядра для каждого докера, потенциально (или, возможно, 1, я не уверен на этом на 100%).

Однако вы можете настроить файл conf, сгенерированный для данного контейнера, и установить что-то вроде

cpuset {
    cpuset.cpus="0-3";
}

Ответ 2

Возможно, все изменилось в последних (нескольких) версиях. В настоящее время вы можете ограничить контейнер для докеров с параметрами для docker run: Эквивалент для текущего ответа в новой версии докера docker run ubuntu /bin/echo 'Hello world --cpuset-cpus="0-3" Однако это ограничит процесс докеры для этих CPU, но (пожалуйста, исправьте меня, если я ошибаюсь), другие контейнеры также могут запросить один и тот же набор. Возможно, лучший способ - использовать доли CPU.

Для получения дополнительной информации см. https://docs.docker.com/engine/reference/run/

Ответ 3

В документации ORACLE:

  To control a container CPU usage, you can use the
  --cpu-period  and --cpu-quota options with the docker 
  create and docker run commands  from version 1.7.0 of Docker onward.

  The --cpu-quota option specifies the number of microseconds 
  that a container has access to CPU resources during a 
  period specified by --cpu-period.
  As the default value of --cpu-period is 100000, setting the 
  value of --cpu-quota to 25000 limits a container to 25% of 
  the CPU resources. By default, a container can use all available CPU resources, 
  which corresponds to a --cpu-quota value of -1.

Ответ 4

Итак, если я запустил все контейнеры докеров на этом хосте, будут ли они потреблять CPU/ядра по мере необходимости, как если бы они выполнялись как обычные установленные приложения на этой ОС хоста?

Да.

CPU

По умолчанию каждый доступ к контейнерам для циклов ЦП хост-компьютеров неограничен. Вы можете установить различные ограничения для ограничения доступа к конкретным контейнерам для циклов ЦП хост-компьютеров.


Будет ли контейнер докера потреблять собственный процесс, и вся содержащаяся в нем обработка будет зависеть от этого основного ядра процессора?

Неа.

Docker использует полнофункциональный планировщик для совместного использования ресурсов процессора между контейнерами. Таким образом, контейнеры имеют настраиваемый доступ к ЦП.


Как я могу указать контейнер докера для использования нескольких ядер (например, 4). Я видел, что есть флаг -C, который может указывать на основной идентификатор, но, похоже, нет возможности указать контейнер для выбора N ядер в случайном порядке.

Конфигурируется over. В Docker есть дополнительные опции cpu, которые вы можете комбинировать.

- cpus = Укажите, сколько из доступных ресурсов ЦП может использовать контейнер. Например, если хост-машина имеет два процессора и вы устанавливаете --cpus = "1,5", то контейнер гарантирован максимум на полторы CPU.

- cpuset-cpus Ограничьте конкретные процессоры или ядра, которые может использовать контейнер. Список разделенных запятыми или разделенных запятыми диапазонов ЦП, которые может использовать контейнер, если у вас несколько процессоров. Первый процессор пронумерован 0. Допустимым значением может быть 0-3 (для использования первого, второго, третьего и четвертого CPU) или 1,3 (для использования второго и четвертого CPU).

И многое другое...