Принцип Docker так прост!

Linux Docker

Оригинал: 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

Затем создайте группу с именемxjjdogcgroups, название, называется控制组.

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, добро пожаловать в друзья для дальнейшего общения.​