stringtranslate.com

cgroups

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 имеет только одну иерархию процессов и различает процессы, а не потоки.

Функции

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

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

Использовать

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

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

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

Документация ядра 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.

Пространства имен создаются с помощью команды «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]

Смотрите также

Ссылки

  1. ^ "Control Group v2 — Документация ядра Linux". www.kernel.org . Получено 24 июня 2023 г. .
  2. Джонатан Корбет (29 мая 2007 г.). «Контейнеры для обработки». LWN.net.
  3. ^ ab Jonathan Corbet (29 октября 2007 г.). "Заметки из контейнера". LWN.net . Получено 14 апреля 2015 г. Первоначальное название 'containers' считалось слишком общим — этот код является важной частью решения для контейнера, но это далеко не все. Поэтому контейнеры теперь переименованы в 'control groups' (или 'cgroups') и объединены для 2.6.24.
  4. ^ "cgroup: convert to kernfs". Список рассылки по ядру Linux . 28 января 2014 г.
  5. ^ "netfilter: x_tables: облегченное соответствие групп управления процессами". 23 апреля 2014 г. Архивировано из оригинала 24 апреля 2014 г.
  6. ^ "cgroup: подготовка к единой иерархии по умолчанию". 13 марта 2014 г.
  7. ^ ab "Documentation/cgroup-v2.txt, как он появился в ядре Linux 4.5". 14 марта 2016 г.
  8. ^ "cgroup v2: Множественные иерархии".
  9. ^ "разница между ядрами Linux 4.4 и 4.5". 14 марта 2016 г.
  10. Джонатан Корбет (31 июля 2007 г.). «Управление использованием памяти в контейнерах». LWN.
  11. ^ Балбир Сингх, Вайдинатан Шринивасан (июль 2007 г.). «Контейнеры: проблемы с контроллером ресурсов памяти и его производительностью» (PDF) . Симпозиум по Linux в Оттаве.
  12. ^ Карвальо, Андре. «Использование cgroups для ограничения ввода-вывода». andrestc.com . Получено 12 сентября 2022 г. .
  13. ^ Луу, Дэн. «Проблема регулирования контейнера». danluu.com . Получено 12 сентября 2022 г. .
  14. ^ Derr, Simon (2004). "CPUSETS" . Получено 12 сентября 2022 г.
  15. ^ "setrlimit(2) — Arch manual pages". man.archlinux.org . Получено 27 ноября 2023 г. .
  16. Джонатан Корбет (23 октября 2007 г.). «Пространство ядра: справедливое планирование пользователя для Linux». Network World. Архивировано из оригинала 19 октября 2013 г. Получено 22 августа 2012 г.
  17. ^ Камкамэдзава Хирою (19 ноября 2008 г.). Cgroup и контроллер ресурсов памяти (PDF) . Японский симпозиум Linux. Архивировано из оригинала (слайды презентации PDF) 22 июля 2011 г.
  18. ^ ab Дэйв Хансен. Управление ресурсами (слайды презентации PDF) . Linux Foundation.
  19. Мэтт Хелсли (3 февраля 2009 г.). «LXC: инструменты контейнера Linux». IBM developerWorks.
  20. ^ "Интеграция групп Grid Engine". Масштабируемая логика. 22 мая 2012 г.
  21. ^ "cgroups". kernel.org.
  22. ^ "Torvalds/Linux". GitHub . 13 февраля 2022 г.
  23. ^ "Systemd-cgtop".
  24. ^ "All About the Linux Kernel: Cgroup's Redesign". Linux.com . 15 августа 2013 г. Архивировано из оригинала 28 апреля 2019 г. Получено 19 мая 2014 г.
  25. ^ "Единая иерархия контрольной группы в 3.16". LWN.net . 11 июня 2014 г.
  26. ^ "Получить обновления cgroup для 3.15 от Tejun Heo". kernel.org . 3 апреля 2014 г.
  27. ^ "Получить обновления cgroup для 3.16 от Tejun Heo". kernel.org . 9 июня 2014 г.
  28. Павел Емельянов, Кир Колышкин (19 ноября 2007 г.). «Пространства имен PID в ядре 2.6.24». LWN.net.
  29. Джонатан Корбет (30 января 2007 г.). «Пространства имен сети». LWN.net.
  30. ^ Серж Э. Халлин, Рам Пай (17 сентября 2007 г.). «Применение пространств имен монтирования». IBM developerWorks.
  31. ^ Майкл Керриск (27 февраля 2013 г.). «Пространства имен в действии, часть 5: Пользовательские пространства имен». Информация о Linux на lwn.net из источника.
  32. ^ «LKML: Линус Торвальдс: Linux 4.6-rc1».
  33. ^ Джанак Десаи (11 января 2006 г.). «Документация ядра Linux по unshare».
  34. ^ "Использование пространств имен в Плане 9". 1992. Архивировано из оригинала 6 сентября 2014 года . Получено 15 февраля 2015 года .
  35. ^ "kernfs, sysfs, driver-core: реализовать синхронное самоудаление". LWN.net . 3 февраля 2014 г. Получено 7 апреля 2014 г.
  36. ^ "Исходное дерево ядра Linux: kernel/git/torvalds/linux.git: cgroups: convert to kernfs". kernel.org . 11 февраля 2014 г. . Получено 23 мая 2014 г. .
  37. ^ "memcg: kmem controller infrastructure". kernel.org исходный код. 18 декабря 2012 г.
  38. ^ "memcg: базовая инфраструктура учета kmem". Исходный код kernel.org . 18 декабря 2012 г.
  39. ^ "memcg: добавить документацию о контроллере kmem". kernel.org . 18 декабря 2012 г.
  40. ^ "Linux_4.19 - Новички в ядре Linux".
  41. ^ ab "Mesosphere to Bring Google's Kubernetes to Mesos". Mesosphere.io. 10 июля 2014 г. Архивировано из оригинала 6 сентября 2015 г. Получено 13 июля 2014 г.
  42. ^ "6.0 Release Notes" (PDF) . redhat.com . Получено 12 сентября 2023 г. .
  43. ^ «1732114 – Измените Fedora 31 для использования CgroupsV2 по умолчанию».

Внешние ссылки