Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

cgroups (сокращенно от контрольных групп ) - это функция ядра Linux, которая ограничивает, учитывает и изолирует использование ресурсов (ЦП, память, дисковый ввод-вывод, сеть и т. д.) коллекцией процессов .

Инженеры Google (в первую очередь Пол Менедж и Рохит Сет ) начали работу над этой функцией в 2006 году под названием «контейнеры процессов». [1] В конце 2007 года номенклатура была изменена на «группы управления», чтобы избежать путаницы, вызванной множеством значений термина « контейнер » в контексте ядра Linux, а функции групп управления были объединены в основную линию ядра Linux в версии ядра 2.6. .24, который был выпущен в январе 2008 года. [2] С тех пор разработчики добавили много новых функций и контроллеров, таких как поддержка kernfs в 2014 году, [3] межсетевой экран , [4] и унифицированная иерархия.[5] cgroup v2 была объединена с ядром Linux 4.5 со значительными изменениями интерфейса и внутренней функциональности. [6]

Версии [ править ]

Есть две версии контрольных групп.

Изначально Cgroups были написаны Полом Менеджем и Рохитом Сетом и включены в ядро ​​Linux в 2007 году. Впоследствии это называется cgroups версии 1. [7]

Затем разработку и поддержку групп взял на себя Теджун Хео . Теджун Хео переработал и переписал контрольные группы. Это переписывание теперь называется версией 2, документация по cgroups-v2 впервые появилась в ядре Linux 4.5, выпущенном 14 марта 2016 года. [8]

В отличие от v1, cgroup v2 имеет только одну иерархию процессов и различает процессы, а не потоки.

Особенности [ править ]

Одна из целей разработки cgroups - предоставить унифицированный интерфейс для множества различных сценариев использования , от управления отдельными процессами (например, с помощью nice ) до полной виртуализации на уровне операционной системы (предоставляемой OpenVZ , Linux-VServer или LXC , Например). Cgroups предоставляет:

Ограничение ресурсов
группы можно настроить так, чтобы они не превышали установленный предел памяти , который также включает кеш файловой системы [9] [10]
Приоритезация
некоторые группы могут получить большую долю использования ЦП [11] или пропускной способности дискового ввода-вывода [12]
Бухгалтерский учет
измеряет использование ресурсов группой, которое может быть использовано, например, для выставления счетов [13]
Контроль
замораживание групп процессов, их контрольная точка и перезапуск [13]

Используйте [ редактировать ]

В качестве примера косвенного использования systemd предполагает монопольный доступ к cgroups.

Контрольная группа (сокращенно cgroup) - это совокупность процессов, которые связаны одними и теми же критериями и связаны с набором параметров или ограничений. Эти группы могут быть иерархическими, что означает, что каждая группа наследует ограничения от своей родительской группы. Ядро предоставляет доступ к нескольким контроллерам (также называемым подсистемами) через интерфейс cgroup; [2] например, контроллер «памяти» ограничивает использование памяти, «cpuacct» учитывает использование ЦП и т. Д.

Группы управления можно использовать несколькими способами:

  • Получив доступ к виртуальной файловой системе cgroup вручную.
  • Создавая группы и управляя ими на лету, используя такие инструменты, как cgcreate , cgexec и cgclassify (из libcgroup ).
  • Через «демон механизма правил», который может автоматически перемещать процессы определенных пользователей, групп или команд в cgroups, как указано в его конфигурации.
  • Косвенно через другое программное обеспечение , которое использует контрольные группы, такие как Докер , Firejail , LXC , [14] Libvirt , Systemd , Open Grid Scheduler / Grid Engine , [15] и развитием несуществующей компании Google lmctfy .

Документация ядра Linux содержит некоторые технические детали установки и использования групп управления версии 1 [16] и версии 2. Команда [17] systemd-cgtop[18] может использоваться для отображения основных групп управления по их использованию ресурсов.

Редизайн [ править ]

Редизайн контрольных групп начался в 2013 году [19] с дополнительными изменениями, внесенными версиями 3.15 и 3.16 ядра Linux. [20] [21] [22]

Изоляция пространства имен [ править ]

Хотя технически это не является частью работы cgroups, связанная функция ядра Linux - это изоляция пространства имен , когда группы процессов разделены так, что они не могут «видеть» ресурсы в других группах. Например, пространство имен PID предоставляет отдельное перечисление идентификаторов процессов в каждом пространстве имен. Также доступны пространства имен mount, user, UTS, network и SysV IPC.

  • Пространство имен PID обеспечивает изоляцию для распределения идентификаторов процессов (PID), списков процессов и их деталей. Хотя новое пространство имен изолировано от других братьев и сестер, процессы в его «родительском» пространстве имен по-прежнему видят все процессы в дочерних пространствах имен, хотя и с разными номерами PID. [23]
  • Сетевое пространство имен изолирует контроллеры сетевого интерфейса (физические или виртуальные), правила межсетевого экрана iptables , таблицы маршрутизации и т. Д. Сетевые пространства имен могут быть связаны друг с другом с помощью виртуального устройства Ethernet «veth». [24]
  • Пространство имен «UTS» позволяет изменять имя хоста .
  • Пространство имен Mount позволяет создать другую структуру файловой системы или сделать определенные точки монтирования доступными только для чтения. [25]
  • Пространство имен IPC изолирует межпроцессное взаимодействие System V между пространствами имен.
  • Пространство имен пользователей изолирует идентификаторы пользователей между пространствами имен. [26]
  • Пространство имен Cgroup [27]

Пространства имен создаются с помощью команды «unshare» или системного вызова , или как новые флаги в системном вызове «clone». [28]

Подсистема "ns" была добавлена ​​на раннем этапе разработки cgroups для интеграции пространств имен и групп управления. Если была смонтирована контрольная группа "ns", каждое пространство имен также создаст новую группу в иерархии контрольных групп. Это был эксперимент, который позже был признан плохо подходящим для cgroups API и удален из ядра.

Пространства имен Linux были вдохновлены более общей функциональностью пространств имен, широко используемой в Plan 9 от Bell Labs . [29]

Единая иерархия [ править ]

Kernfs был введен в ядро ​​Linux с версией 3.14 в марте 2014 года, основным автором является Теджун Хео. [30] Одним из основных мотиваторов для отдельного kernfs является файловая система cgroups. Kernfs в основном создается путем разделения некоторой логики sysfs на независимый объект, что упрощает для других подсистем ядра реализацию собственной виртуальной файловой системы с обработкой подключения и отключения устройств, динамическим созданием и удалением и другими атрибутами. Редизайн продолжился до версии 3.15 ядра Linux. [31]

Группы управления памятью ядра (kmemcg) [ править ]

Группы управления памятью ядра ( kmemcg ) были объединены в версию 3.8 (18 февраля 2013 г . ; 8 лет назад ) основной ветки ядра Linux . [32] [33] [34] Контроллер kmemcg может ограничивать объем памяти, который ядро ​​может использовать для управления собственными внутренними процессами. ( 18-02-2013 )

осведомленность cgroup об убийце OOM [ править ]

Ядро Linux 4.19 (октябрь 2018 г.) представило cgroup осведомленность о реализации OOM killer, которая добавляет возможность уничтожать cgroup как единое целое и тем самым гарантировать целостность рабочей нагрузки. [35]

Принятие [ править ]

Различные проекты используют контрольные группы в качестве основы, включая CoreOS , Docker (в 2013 году), Hadoop , Jelastic , Kubernetes , [36] lmctfy (Let Me Contain That For You), LXC (LinuX Containers), systemd , Mesos и Mesosphere , [36] ] и HTCondor . Основные дистрибутивы Linux также приняли его, например, Red Hat Enterprise Linux (RHEL) 6.0 в ноябре 2010 года, спустя три года после принятия основным ядром Linux. [37]

29 октября 2019 года проект Fedora модифицировал Fedora 31, чтобы по умолчанию использовать CgroupsV2 [38]

См. Также [ править ]

  • Реализации виртуализации на уровне операционной системы
  • Группа процессов
  • Tc (Linux)  - утилита управления трафиком, которая имеет небольшое функциональное перекрытие с сетевыми настройками контрольной группы.

Ссылки [ править ]

  1. Джонатан Корбет (29 мая 2007 г.). «Технологические контейнеры» . LWN.net.
  2. ^ a b Джонатан Корбет (29 октября 2007 г.). «Записки из тары» . LWN.net . Проверено 14 апреля 2015 года . Первоначальное название «контейнера» было сочтено слишком общим - этот код является важной частью контейнерного решения, но это далеко не все. Таким образом, контейнеры были переименованы в «контрольные группы» (или «контрольные группы») и объединены для версии 2.6.24.
  3. ^ "cgroup: преобразовать в kernfs" . Список рассылки ядра Linux . 28 января 2014 г.
  4. ^ "netfilter: x_tables: облегченное сопоставление групп управления процессом" . 23 апреля 2014. Архивировано из оригинала 24 апреля 2014 года.
  5. ^ "cgroup: подготовьтесь к единой иерархии по умолчанию" . 13 марта 2014 г.
  6. ^ "cgroup v2: Несколько иерархий" .
  7. ^ "разница между ядром Linux 4.4 и 4.5" . 14 марта 2016 г.
  8. ^ «Документация / cgroup-v2.txt в том виде, в каком она появилась в ядре Linux 4.5» . 14 марта 2016 г.
  9. Джонатан Корбет (31 июля 2007 г.). «Контроль использования памяти в контейнерах» . LWN.
  10. ^ Balbir Сингх, Vaidynathan Srinivasan (июль 2007). «Контейнеры: проблемы с контроллером ресурсов памяти и его производительностью» (PDF) . Оттавский симпозиум по Linux.
  11. Джонатан Корбет (23 октября 2007 г.). «Пространство ядра: справедливое планирование пользователей для Linux» . Сетевой мир. Архивировано из оригинального 19 октября 2013 года . Проверено 22 августа 2012 года .
  12. ^ Kamkamezawa Hiroyu (19 ноября 2008). Cgroup и контроллер ресурсов памяти (PDF) . Симпозиум по Linux в Японии. Архивировано из оригинала (слайды презентации в формате PDF) 22 июля 2011 года.
  13. ^ a b Дэйв Хансен. Управление ресурсами (слайды презентации в формате PDF) . Linux Foundation.
  14. ^ Matt Helsley (3 февраля 2009). «LXC: контейнерные инструменты Linux» . IBM developerWorks.
  15. ^ "Интеграция cgroups Grid Engine" . Масштабируемая логика. 22 мая 2012 г.
  16. ^ "cgroups" . kernel.org.
  17. ^ https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/cgroup-v2.rst
  18. ^ https://www.freedesktop.org/software/systemd/man/systemd-cgtop.html
  19. ^ «Все о ядре Linux: редизайн Cgroup» . Linux.com . 15 августа 2013 . Проверено 19 мая 2014 .
  20. ^ "Единая иерархия групп управления в 3.16" . LWN.net . 11 июня 2014 г.
  21. ^ "Получите обновления cgroup для 3.15 от Tejun Heo" . kernel.org . 3 апреля 2014 г.
  22. ^ "Получите обновления cgroup для 3.16 от Tejun Heo" . kernel.org . 9 июня 2014 г.
  23. Павел Емельянов, Кир Колышкин (19 ноября 2007 г.). «Пространства имен PID в ядре 2.6.24» . LWN.net.
  24. Джонатан Корбет (30 января 2007 г.). «Сетевые пространства имен» . LWN.net.
  25. ^ Serge Е. Hallyn, Ram Пай (17 сентября 2007). «Применение пространств имен монтирования» . IBM developerWorks.
  26. ^ Майкл Керриск (27 февраля 2013 г.). «Действующие пространства имен, часть 5: Пространства имен пользователей» . lwn.net Linux Информация из источника.
  27. ^ https://lkml.org/lkml/2016/3/26/132/
  28. ^ Janak Десаи (11 января 2006). «Документация ядра Linux на нераспространении» .
  29. ^ «Использование пространств имен в плане 9» . 1992. Архивировано из оригинала на 6 сентября 2014 года . Проверено 15 февраля 2015 года .
  30. ^ "kernfs, sysfs, ядро ​​драйвера: реализовать синхронное самоудаление" . LWN.net . 3 февраля 2014 . Проверено 7 апреля 2014 года .
  31. ^ "Дерево исходных текстов ядра Linux: kernel / git / torvalds / linux.git: cgroups: convert to kernfs" . kernel.org . 11 февраля 2014 . Дата обращения 23 мая 2014 .
  32. ^ "memcg: инфраструктура контроллера kmem" . Исходный код kernel.org . 18 декабря 2012 г.
  33. ^ "memcg: базовая инфраструктура учета kmem" . Исходный код kernel.org . 18 декабря 2012 г.
  34. ^ "memcg: добавить документацию о контроллере kmem" . kernel.org . 18 декабря 2012 г.
  35. ^ https://kernelnewbies.org/Linux_4.19#Memory_management
  36. ^ a b «Мезосфера, чтобы перенести Kubernetes Google в Мезос» . Mesosphere.io. 10 июля 2014. Архивировано из оригинала 6 сентября 2015 года . Проверено 13 июля 2014 года .
  37. ^ https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/pdf/6.0_Release_Notes/Red_Hat_Enterprise_Linux-6-6.0_Release_Notes-en-US.pdf
  38. ^ https://bugzilla.redhat.com/show_bug.cgi?id=1732114

Внешние ссылки [ править ]

  • Документация ядра Linux в cgroups
  • Пространства имен и контрольные группы ядра Linux, Рами Розен
  • Пространства имен и контрольные группы, основа контейнеров Linux (включая cgroups v2) , слайды выступления Рами Розена, Netdev 1.1, Севилья, Испания, 2016 г.
  • Понимание нового API групп управления , LWN.net , Рами Розен, март 2016 г.
  • Управление крупномасштабным кластером в Google с Borg , апрель 2015 г., Абхишек Верма, Луис Педроса, Мадукар Коруполу, Дэвид Оппенгеймер, Эрик Тьюн и Джон Уилкс.
  • Объекты заданий , аналогичная функция в Windows