cgroups (сокращенно от control groups ) — это функция ядра Linux , которая ограничивает, учитывает и изолирует использование ресурсов (ЦП, памяти, дискового ввода-вывода и т. д. [1] ) набора процессов .
Инженеры Google начали работу над этой функцией в 2006 году под названием «контейнеры процессов». [2] В конце 2007 года номенклатура была изменена на «группы управления», чтобы избежать путаницы, вызванной множественными значениями термина « контейнер » в контексте ядра Linux, а функциональность групп управления была объединена с основной веткой ядра Linux в версии ядра 2.6.24, которая была выпущена в январе 2008 года. [3] С тех пор разработчики добавили много новых функций и контроллеров, таких как поддержка kernfs в 2014 году, [4] брандмауэр , [5] и унифицированная иерархия. [6] cgroup v2 была объединена в ядре Linux 4.5 [7] со значительными изменениями в интерфейсе и внутренней функциональности. [8]
Версии
Существует две версии cgroups.
Cgroups изначально был написан Полом Менажем и Рохитом Сетом и в 2007 году вошел в состав основного ядра Linux. Впоследствии он стал называться cgroups версии 1. [9]
Затем разработку и поддержку cgroups взял на себя Теджун Хео. Теджун Хео перепроектировал и переписал cgroups. Эта переделка теперь называется версией 2, документация cgroup-v2 впервые появилась в ядре Linux 4.5, выпущенном 14 марта 2016 года. [7]
В отличие от v1, cgroup v2 имеет только одну иерархию процессов и различает процессы, а не потоки.
Группы могут быть настроены так, чтобы не превышать настроенный лимит памяти , который также включает кэш файловой системы , [10] [11] ограничение полосы пропускания ввода-вывода, [12] ограничение квоты ЦП, [13] установленный лимит ЦП, [14] или максимальное количество открытых файлов . [15]
Приоритезация
некоторые группы могут получить большую долю использования ЦП [16] или пропускной способности дискового ввода-вывода [17]
Бухгалтерский учет
измеряет использование ресурсов группой, что может быть использовано, например, для выставления счетов [18]
Группа управления (сокращенно cgroup) — это набор процессов, которые связаны одними и теми же критериями и связаны с набором параметров или ограничений. Эти группы могут быть иерархическими, что означает, что каждая группа наследует ограничения от своей родительской группы. Ядро предоставляет доступ к нескольким контроллерам (также называемым подсистемами) через интерфейс cgroup; [3] например, контроллер «memory» ограничивает использование памяти, «cpuacct» учитывает использование процессора и т. д.
Контрольные группы можно использовать несколькими способами:
Путем ручного доступа к виртуальной файловой системе cgroup.
Создавая и управляя группами «на лету» с помощью таких инструментов, как cgcreate, cgexec, и cgclassify(из libcgroup).
С помощью «демона механизма правил», который может автоматически перемещать процессы определенных пользователей, групп или команд в контрольные группы, как указано в его конфигурации.
Документация ядра Linux содержит некоторые технические подробности настройки и использования контрольных групп версии 1 [21] и версии 2. Команду [22] systemd-cgtop[23] можно использовать для отображения основных контрольных групп по использованию ими ресурсов.
Редизайн
Редизайн cgroups начался в 2013 году [24] с дополнительными изменениями, внесенными версиями 3.15 и 3.16 ядра Linux. [25] [26] [27]
Изоляция пространства имен
Хотя технически это не является частью работы cgroups, связанной функцией ядра Linux является изоляция пространства имен , когда группы процессов разделены таким образом, что они не могут «видеть» ресурсы в других группах. Например, пространство имен PID обеспечивает отдельное перечисление идентификаторов процессов в каждом пространстве имен. Также доступны пространства имен mount, user, UTS (Unix Time Sharing), network и SysV IPC.
Пространство имен PID обеспечивает изоляцию для выделения идентификаторов процессов (PID), списков процессов и их деталей. В то время как новое пространство имен изолировано от других сестринских, процессы в его «родительском» пространстве имен по-прежнему видят все процессы в дочерних пространствах имен, хотя и с разными номерами PID. [28]
Сетевое пространство имен изолирует контроллеры сетевых интерфейсов (физические или виртуальные), правила брандмауэра iptables , таблицы маршрутизации и т. д. Сетевые пространства имен могут быть связаны друг с другом с помощью виртуального устройства Ethernet «veth». [29]
Пространство имен «UTS» позволяет изменять имя хоста .
Пространство имен монтирования позволяет создавать другую структуру файловой системы или делать определенные точки монтирования доступными только для чтения. [30]
Пространство имен пользователя изолирует идентификаторы пользователей между пространствами имен. [31]
Пространство имен Cgroup [32]
Пространства имен создаются с помощью команды «unshare» или системного вызова , или как «новые» флаги в системном вызове «clone». [33]
Подсистема "ns" была добавлена на ранней стадии разработки cgroups для интеграции пространств имен и групп управления. Если бы была смонтирована cgroup "ns", каждое пространство имен также создало бы новую группу в иерархии cgroup. Это был эксперимент, который позже был признан неподходящим для API cgroups и удален из ядра.
Пространства имен Linux были вдохновлены более общей функциональностью пространств имен, широко используемой в Plan 9 от Bell Labs . [34]
Единая иерархия
Kernfs был представлен в ядре Linux с версией 3.14 в марте 2014 года, основным автором был Теджун Хео. [35] Одним из главных мотиваторов для отдельной kernfs является файловая система cgroups. Kernfs в основном создается путем разделения части логики sysfs в независимую сущность, тем самым облегчая для других подсистем ядра реализацию их собственной виртуальной файловой системы с обработкой подключения и отключения устройств, динамического создания и удаления и других атрибутов. Редизайн продолжился в версии 3.15 ядра Linux. [36]
Группы управления памятью ядра (kmemcg)
Группы управления памятью ядра ( kmemcg ) были объединены в версию 3.8 (18 февраля 2013 г .; 11 лет назад ) основной ветки ядра Linux . [37] [38] [39] Контроллер kmemcg может ограничивать объем памяти, который ядро может использовать для управления своими внутренними процессами. ( 18-02-2013 )
cgroup осведомленность об OOM killer
В Linux Kernel 4.19 (октябрь 2018 г.) появилась поддержка cgroup для реализации OOM killer , которая позволяет уничтожать cgroup как единое целое и тем самым гарантировать целостность рабочей нагрузки. [40]
Принятие
Различные проекты используют cgroups в качестве своей основы, включая CoreOS , Docker (в 2013 году), Hadoop , Jelastic , Kubernetes , [41] lmctfy (Let Me Contain That For You), LXC (Linux Containers), systemd , Mesos и Mesosphere, [41] и HTCondor .
Основные дистрибутивы Linux также приняли его, например, Red Hat Enterprise Linux (RHEL) 6.0 в ноябре 2010 года, за три года до принятия его основным ядром Linux. [42]
29 октября 2019 года Fedora Project изменил Fedora 31 для использования CgroupsV2 по умолчанию [43]
^ "Control Group v2 — Документация ядра Linux". www.kernel.org . Получено 24 июня 2023 г. .
↑ Джонатан Корбет (29 мая 2007 г.). «Контейнеры для обработки». LWN.net.
^ ab Jonathan Corbet (29 октября 2007 г.). "Заметки из контейнера". LWN.net . Получено 14 апреля 2015 г. Первоначальное название 'containers' считалось слишком общим — этот код является важной частью решения для контейнера, но это далеко не все. Поэтому контейнеры теперь переименованы в 'control groups' (или 'cgroups') и объединены для 2.6.24.
^ "netfilter: x_tables: облегченное соответствие групп управления процессами". 23 апреля 2014 г. Архивировано из оригинала 24 апреля 2014 г.
^ "cgroup: подготовка к единой иерархии по умолчанию". 13 марта 2014 г.
^ ab "Documentation/cgroup-v2.txt, как он появился в ядре Linux 4.5". 14 марта 2016 г.
^ "cgroup v2: Множественные иерархии".
^ "разница между ядрами Linux 4.4 и 4.5". 14 марта 2016 г.
↑ Джонатан Корбет (31 июля 2007 г.). «Управление использованием памяти в контейнерах». LWN.
^ Балбир Сингх, Вайдинатан Шринивасан (июль 2007 г.). «Контейнеры: проблемы с контроллером ресурсов памяти и его производительностью» (PDF) . Симпозиум по Linux в Оттаве.
^ Карвальо, Андре. «Использование cgroups для ограничения ввода-вывода». andrestc.com . Получено 12 сентября 2022 г. .
^ Луу, Дэн. «Проблема регулирования контейнера». danluu.com . Получено 12 сентября 2022 г. .
^ Derr, Simon (2004). "CPUSETS" . Получено 12 сентября 2022 г.
^ "setrlimit(2) — Arch manual pages". man.archlinux.org . Получено 27 ноября 2023 г. .
↑ Джонатан Корбет (23 октября 2007 г.). «Пространство ядра: справедливое планирование пользователя для Linux». Network World. Архивировано из оригинала 19 октября 2013 г. Получено 22 августа 2012 г.
^ Камкамэдзава Хирою (19 ноября 2008 г.). Cgroup и контроллер ресурсов памяти (PDF) . Японский симпозиум Linux. Архивировано из оригинала (слайды презентации PDF) 22 июля 2011 г.
^ ab Дэйв Хансен. Управление ресурсами (слайды презентации PDF) . Linux Foundation.
↑ Мэтт Хелсли (3 февраля 2009 г.). «LXC: инструменты контейнера Linux». IBM developerWorks.
^ "Интеграция групп Grid Engine". Масштабируемая логика. 22 мая 2012 г.
^ "All About the Linux Kernel: Cgroup's Redesign". Linux.com . 15 августа 2013 г. Архивировано из оригинала 28 апреля 2019 г. Получено 19 мая 2014 г.
^ "Единая иерархия контрольной группы в 3.16". LWN.net . 11 июня 2014 г.
^ "Получить обновления cgroup для 3.15 от Tejun Heo". kernel.org . 3 апреля 2014 г.
^ "Получить обновления cgroup для 3.16 от Tejun Heo". kernel.org . 9 июня 2014 г.
↑ Павел Емельянов, Кир Колышкин (19 ноября 2007 г.). «Пространства имен PID в ядре 2.6.24». LWN.net.
↑ Джонатан Корбет (30 января 2007 г.). «Пространства имен сети». LWN.net.
^ Серж Э. Халлин, Рам Пай (17 сентября 2007 г.). «Применение пространств имен монтирования». IBM developerWorks.
^ Майкл Керриск (27 февраля 2013 г.). «Пространства имен в действии, часть 5: Пользовательские пространства имен». Информация о Linux на lwn.net из источника.
^ «LKML: Линус Торвальдс: Linux 4.6-rc1».
^ Джанак Десаи (11 января 2006 г.). «Документация ядра Linux по unshare».
^ "Использование пространств имен в Плане 9". 1992. Архивировано из оригинала 6 сентября 2014 года . Получено 15 февраля 2015 года .
^ "kernfs, sysfs, driver-core: реализовать синхронное самоудаление". LWN.net . 3 февраля 2014 г. Получено 7 апреля 2014 г.
^ "Исходное дерево ядра Linux: kernel/git/torvalds/linux.git: cgroups: convert to kernfs". kernel.org . 11 февраля 2014 г. . Получено 23 мая 2014 г. .
^ "memcg: kmem controller infrastructure". kernel.org исходный код. 18 декабря 2012 г.
^ "memcg: базовая инфраструктура учета kmem". Исходный код kernel.org . 18 декабря 2012 г.
^ "memcg: добавить документацию о контроллере kmem". kernel.org . 18 декабря 2012 г.
^ "Linux_4.19 - Новички в ядре Linux".
^ ab "Mesosphere to Bring Google's Kubernetes to Mesos". Mesosphere.io. 10 июля 2014 г. Архивировано из оригинала 6 сентября 2015 г. Получено 13 июля 2014 г.
^ "6.0 Release Notes" (PDF) . redhat.com . Получено 12 сентября 2023 г. .
^ «1732114 – Измените Fedora 31 для использования CgroupsV2 по умолчанию».
Внешние ссылки
Официальная документация ядра Linux по cgroups v1 и cgroups v2
Руководство по управлению ресурсами Red Hat по cgroups
Страница руководства Ubuntu по cgroups Архивировано 9 августа 2021 г. на Wayback Machine
Пространства имен и контрольные группы ядра Linux, Рами Розен (2013)
Пространства имен и cgroups, основа контейнеров Linux (включая cgroups v2), слайды доклада Рами Розена, Netdev 1.1, Севилья, Испания, 2016 г.
Понимание нового API групп управления, LWN.net , Рами Розен, март 2016 г.
Крупномасштабное управление кластерами в Google с Боргом, апрель 2015 г., Абхишек Верма, Луис Педроса, Мадукар Коруполу, Дэвид Оппенгеймер, Эрик Тьюн и Джон Уилкс.