Оригинал: Miss Sister Taste (идентификатор публичной учетной записи WeChat: xjjdog), добро пожаловать, пожалуйста, сохраните источник для перепечатки.
Многие студенты, знакомящиеся с Docker, столкнулись с термином cgroup. Это древний метод в Linux для реализации ограничений ресурсов, таких как ЦП, память и т. д. Однако многие студенты сообщили, что эта технология немного неясна и сложна для понимания.
Цель этой статьи — дать вам самый простой и интуитивно понятный способ понять, что такое контрольные группы.
В продолжение предыдущей статьи:«Быстро понять основные принципы Docker за 5 минут | пространство имен»
Cgroups являются важным базовым средством для реализации функций Docker. Как показано на рисунке выше, с помощью cgroups можно превратить различные ресурсы операционной системы в пулы, а затем через конфигурацию получить соответствующие ресурсы.
Так как же это достигается?
обращать вниманиеcgroups
Это существительное имеет две характеристики. прежде всегоc
,этоControl
Значение глагола, вторая частьgroups
, доказывая, что это组
.
1. Цель глагола
контроль, используемый для ограничения чего? Кроме процессора, памяти, что еще?
Используйте команду mount для просмотра предельных целей, поддерживаемых текущей системой.У нее есть специальный термин, называемый子系统
.
# mount | grep cgroup
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
Различные версии системы имеют некоторые тонкие отличия, в целом классификация подсистем включает в себя следующее:
-
cpu,cpuacct
cpu
В основном ограничивайте использование процессора процессом,cpuacct
Может подсчитывать отчет об использовании процессора процессов в cgroups -
cpuset
Процессы в контрольных группах могут быть выделены отдельным процессором节点
или память节点
, как те вещи, которые делает Нума -
blkio
Блокировка ввода-вывода устройств, которая может ограничивать процессы, такие как физические устройства (диск, SSD, USB и т. д.) -
devices
Управляющий процесс имеет доступ к определенным устройствам -
net_cls
Отмечать сетевые пакеты процессов в cgroups, которыми потом можно управлять с помощью модуля tc (управление трафиком) -
net_prio
— Эта подсистема используется для приоритизации сетевого трафика. -
freezer
Процессы в cgroups могут быть приостановлены или возобновлены. -
ns
Процессы в разных контрольных группах могут использовать разные пространства имен. -
hugetlb
В основном он ограничен системой HugeTLB, которая представляет собой огромную файловую систему страниц.
Контента много, но большинство из нас обычно фокусируется на памяти и процессоре, эти сложные детали не влияют на наше понимание принципов его построения.
Давайте возьмем ЦП в качестве примера, чтобы увидеть реальную производительность подсистемы.
2. Пример ограничения использования ЦП
Сначала мы входим в каталог подсистемы процессора.
cd /sys/fs/cgroup/cpu
Затем создайте группу с именемxjjdog
cgroups, название, называется控制组
.
mkdir xjjdog
В это время произошло чудо. Мы используемll
команда, видxjjdog
Содержимое каталога обнаружило, что система по умолчанию сгенерировала для нас кучу файлов.
# ll xjjdog/
total 0
-rw-r--r-- 1 root root 0 Jan 28 21:09 cgroup.clone_children
--w--w--w- 1 root root 0 Jan 28 21:09 cgroup.event_control
-rw-r--r-- 1 root root 0 Jan 28 21:09 cgroup.procs
-r--r--r-- 1 root root 0 Jan 28 21:09 cpuacct.stat
-rw-r--r-- 1 root root 0 Jan 28 21:09 cpuacct.usage
-r--r--r-- 1 root root 0 Jan 28 21:09 cpuacct.usage_percpu
-rw-r--r-- 1 root root 0 Jan 28 21:09 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 Jan 28 21:09 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 Jan 28 21:09 cpu.rt_period_us
-rw-r--r-- 1 root root 0 Jan 28 21:09 cpu.rt_runtime_us
-rw-r--r-- 1 root root 0 Jan 28 21:09 cpu.shares
-r--r--r-- 1 root root 0 Jan 28 21:09 cpu.stat
-rw-r--r-- 1 root root 0 Jan 28 21:09 notify_on_release
-rw-r--r-- 1 root root 0 Jan 28 21:09 tasks
Контролируя значения в этих файлах, можно ограничить ресурсы. Напримерcpu.cfs_quota_us
файл, если мы запишем в него100000
(100 000), то это доказывает, что использованиеxjjdog
группы,最多
может быть использован1核
ПРОЦЕССОР. написать20000
, что доказывает, что наибольшее использование1/5
основной процессор.
Это потому что,cpu.cfs_period_us
Этот файл конфигурации по умолчанию делит 1 ядро ЦП на 100 000 копий.
Затем мы пишем20000
попробуй.
sudo echo 20000 > xjjdog/cpu.cfs_quota_us
Добавляем pid текущего шелла в список контролируемых процессов.
echo $$ > xjjdog/tasks
После завершения выполнения снова запускается бесконечный цикл.
while true;do ;done;
Снова откройте оболочку и используйте top для наблюдения за использованием ЦП. Можно обнаружить, что наш бесконечный цикл использует только до 20% ЦП.us
Держите его ниже 20% и переключайтесь между процессорами без перерыва.
Поэкспериментируйте со следующими командами по очереди, и вы обнаружите, что загрузка ЦП будет постепенно увеличиваться, что примерно равно нашему пределу.
sudo echo 40000 > xjjdog/cpu.cfs_quota_us
sudo echo 60000 > xjjdog/cpu.cfs_quota_us
sudo echo 100000 > xjjdog/cpu.cfs_quota_us
Другие ограничения ресурсов следуют аналогичному мышлению. Тогда самая важная работа - знатьcpu.cfs_quota_us
Что означают такие слова, легко понять, взглянув на инструкцию. Напримерquota
Имеется в виду квота, которая явно ограничивает использование ресурсов.
Как показано на рисунке выше, подсистема может управлять несколькими задачами и включать их в группу управления. Как мы упоминали в прошлой статье, процесс bash можно использовать в качестве процесса № 1 в системе докеров, тогда точно так же дочерние процессы этого процесса № 1 будут использовать одну и ту же конфигурацию квот.
3. Значение группы
Проще говоря, группа относится к группировке различных ресурсов. Ресурсы с разными именами имеют разные конфигурации изоляции. Но у него больше возможностей.
Что более важно, так это его иерархия. Это также легче понять, в основном он существует для упрощения настройки.
Например, в моем каталоге xjjdog выше ограничение на процессор ограничено 0,5 ядрами. В настоящее время я хочу иметь другое приложение, использование процессора ограничено 0,5 ядра, а память ограничена 1 ГБ, тогда я могу напрямую создать каталог xjjdog0 в каталоге xjjdog и настроить память только в xjjdog0 каталог.
Кроме того, если вы ограничите ограничение процессора до 2 ядер на внешнем уровне, а затем ограничите 1/5 ядер в унаследованном каталоге, тогда он сможет использовать только 2/5 ядер операционной системы. Это тоже особенность наследования.
End
cgroups родилась в 2006 году, инициатором являются инженеры Google ( Rohit Seth
иPaul Menage
). Успешно включенная в Linux 2.6.24 в 2008 году, можно сказать, что эта технология очень старая. cgroups теперь стали основой для таких технологий, как systemd, Docker и Linux Containers (LXC).
Как и WSL на платформе Windows, здесь нет функции cgroups, что можно проверить с помощью команды mount, что доказывает, что он не может запустить докер из-за отсутствия фундамента. Однако WSL2 уже делает это.
Некоторых студентов немного беспокоит текущий статус разработки docker, но когда вы ознакомитесь с этими общими базовыми принципами и прочитаете стандарты контейнеров, вы обнаружите, что реализацию верхнего уровня можно заменить docker или containerd. такой же!
Об авторе:Мисс сестра вкус(xjjdog), публичная учетная запись, которая не позволяет программистам идти в обход. Сосредоточьтесь на инфраструктуре и Linux. Десять лет архитектуры, десятки миллиардов ежедневного трафика, обсуждение с вами мира высокой параллелизма, дающие вам другой вкус. Мой личный WeChat xjjdog0, добро пожаловать в друзья для дальнейшего общения.