Как докеры используют ядра ЦП от своей операционной системы?
Мое недопонимание, основанное на том, что Docker основано на LXC, заключается в том, что контейнеры Docker совместно используют различные ресурсы из своей операционной системы хоста. Моя проблема связана с ядрами CPU. Вот сценарий:
- операционная система хоста имеет 8 ядер
- Мне нужно развернуть набор контейнеров докеров на ОС хоста выше.
- Некоторые из контейнеров докеров, которые мне нужно развернуть, лучше подходят для использования 2 ядер
a) Итак, если я запустил все контейнеры докеров на этом хосте, они будут потреблять CPU/ядра по мере необходимости, как если бы они запускались как обычные установленные приложения на этой ОС хоста?
b) Будет ли контейнер докеров потреблять свой собственный процесс, и вся содержащаяся в нем обработка будет зависеть от этого основного ядра процессора?
c) Как я могу указать контейнер докера для использования нескольких ядер (например, 4). Я видел, что есть флаг -C, который может указывать на идентификатор ядра, но, похоже, нет возможности указать контейнер для выбора N ядер в случайном порядке.
Ответы
Ответ 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).
И многое другое...