Cgroups - Cgroups

cgroups
Оригинальный автор (ы)v1: Пол Менедж, Рохит Сет
v2: Теджун Хео
Разработчики)Теджун Хео, Йоханнес Вайнер, Михал Хоко, Вайман Лонг, Роман Гущин, Крис Даун и др.
изначальный выпуск2007; 13 лет назад (2007)
Написано вC
Операционная системаLinux
ТипПрограммное обеспечение
ЛицензияGPL и LGPL
Интернет сайтwww.kernel.org/ doc/Документация/ cgroup-v1/ для v1 и www.kernel.org/ doc/Документация/ cgroup-v2.текст для v2

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

Инженеры на Google (в первую очередь Пол Менедж и Рохит Сет ) начали работу над этой функцией в 2006 году под названием «контейнеры процессов».[1] В конце 2007 года номенклатура была изменена на «контрольные группы», чтобы избежать путаницы, вызванной множеством значений термина «контейнер "в контексте ядра Linux, а функции контрольных групп были объединены в Ядро Linux mainline в версии ядра 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 - предоставить единый интерфейс для множества различных сценарии использования, от управления отдельными процессами (с помощью отлично, например) на полную виртуализация на уровне операционной системы (как предусмотрено 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" позволяет изменить имя хоста.
  • устанавливать пространство имен позволяет создать другую структуру файловой системы или сделать определенные точки монтирования доступными только для чтения.[25]
  • Пространство имен IPC изолирует Систему V межпроцессного взаимодействия между пространствами имен.
  • Пространство имен пользователя изолирует идентификаторы пользователей между пространствами имен.[26]
  • Cgroup пространство имен[27]

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

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

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

Единая иерархия

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

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

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

осведомленность cgroup об убийце OOM

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

Принятие

Различные проекты используют контрольные группы в качестве основы, в том числе CoreOS, Докер (в 2013), Hadoop, Jelastic, Kubernetes,[36] lmctfy (Позвольте мне содержать это для вас), LXC (Контейнеры LinuX), systemd, Mesos и мезосфера,[36] и HTCondor. Основные дистрибутивы Linux также приняли его, например Red Hat Enterprise Linux (RHEL) 6.0 в ноябре 2010 года, три года спустя принятие основной ветки ядра Linux.[37]

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

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

Рекомендации

  1. ^ Джонатан Корбет (29 мая 2007 г.). «Технологические контейнеры». LWN.net.
  2. ^ а б Джонатан Корбет (29 октября 2007 г.). «Записки из контейнера». LWN.net. Получено 14 апреля 2015. Первоначальное название «контейнеров» было сочтено слишком общим - этот код является важной частью контейнерного решения, но это далеко не все. Таким образом, контейнеры были переименованы в «контрольные группы» (или «cgroups») и объединены для версии 2.6.24.
  3. ^ "cgroup: преобразовать в kernfs". lkml. 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. ^ Балбир Сингх, Вайдинатан Сринивасан (июль 2007 г.). «Контейнеры: проблемы с контроллером ресурсов памяти и его производительностью» (PDF). Оттавский симпозиум по Linux.
  11. ^ Джонатан Корбет (23 октября 2007 г.). «Пространство ядра: справедливое планирование пользователей для Linux». Сетевой мир. Архивировано из оригинал 19 октября 2013 г.. Получено 22 августа 2012.
  12. ^ Камкамэдзава Хирою (19 ноября 2008 г.). Cgroup и контроллер ресурсов памяти (PDF). Симпозиум по Linux в Японии. Архивировано из оригинал (Слайды презентации в формате PDF) 22 июля 2011 г.
  13. ^ а б Дэйв Хансен. Управление ресурсами (Слайды презентации в формате PDF). Linux Foundation.
  14. ^ Мэтт Хелсли (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. ^ Серж Э. Халлин, Рам Пай (17 сентября 2007 г.). «Применение пространств имен монтирования». IBM developerWorks.
  26. ^ Майкл Керриск (27 февраля 2013 г.). «Действующие пространства имен, часть 5: Пространства имен пользователей». lwn.net Информация о Linux из источника.
  27. ^ https://lkml.org/lkml/2016/3/26/132/
  28. ^ Джанак Десаи (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. ^ а б «Мезосфера принесет 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

внешняя ссылка