cgroups (abreviado de grupos de control ) es una característica del kernel de Linux que limita, contabiliza y aísla el uso de recursos (CPU, memoria, E/S de disco, etc. [1] ) de una colección de procesos .
Los ingenieros de Google comenzaron a trabajar en esta característica en 2006 bajo el nombre de "contenedores de procesos". [2] A fines de 2007, la nomenclatura cambió a "grupos de control" para evitar la confusión causada por los múltiples significados del término " contenedor " en el contexto del kernel de Linux, y la funcionalidad de los grupos de control se fusionó con la línea principal del kernel de Linux en la versión 2.6.24 del kernel, que se lanzó en enero de 2008. [3] Desde entonces, los desarrolladores han agregado muchas características y controladores nuevos, como soporte para kernfs en 2014, [4] firewalling , [5] y jerarquía unificada. [6] cgroup v2 se fusionó en el kernel de Linux 4.5 [7] con cambios significativos en la interfaz y la funcionalidad interna. [8]
Versiones
Hay dos versiones de cgroups.
Cgroups fue escrito originalmente por Paul Menage y Rohit Seth, y se fusionó con el núcleo principal de Linux en 2007. Posteriormente se lo llamó cgroups versión 1. [9]
El desarrollo y mantenimiento de cgroups quedó a cargo de Tejun Heo, quien rediseñó y reescribió cgroups. Esta reescritura ahora se denomina versión 2; la documentación de cgroup-v2 apareció por primera vez en el kernel de Linux 4.5, publicado el 14 de marzo de 2016. [7]
A diferencia de v1, cgroup v2 solo tiene una única jerarquía de procesos y discrimina entre procesos, no entre subprocesos.
Características
Uno de los objetivos de diseño de cgroups es proporcionar una interfaz unificada para muchos casos de uso diferentes , desde el control de procesos individuales (mediante el uso de nice , por ejemplo) hasta la virtualización completa a nivel de sistema operativo (como la que ofrecen OpenVZ , Linux-VServer o LXC , por ejemplo). Cgroups proporciona:
Algunos grupos pueden obtener una mayor participación en la utilización de la CPU [16] o en el rendimiento de E/S del disco [17].
Contabilidad
mide el uso de recursos de un grupo, que puede utilizarse, por ejemplo, para fines de facturación [18]
Control
congelación de grupos de procesos, su control y reinicio [18]
Usar
Un grupo de control (abreviado como cgroup) es una colección de procesos que están vinculados por los mismos criterios y asociados con un conjunto de parámetros o límites. Estos grupos pueden ser jerárquicos, lo que significa que cada grupo hereda los límites de su grupo padre. El núcleo proporciona acceso a múltiples controladores (también llamados subsistemas) a través de la interfaz cgroup; [3] por ejemplo, el controlador "memory" limita el uso de memoria, "cpuacct" contabiliza el uso de CPU, etc.
Los grupos de control se pueden utilizar de varias maneras:
Accediendo manualmente al sistema de archivos virtual cgroup.
Creando y administrando grupos sobre la marcha utilizando herramientas como cgcreate, cgexec, y cgclassify(desde libcgroup).
A través del "demonio del motor de reglas" que puede mover automáticamente procesos de ciertos usuarios, grupos o comandos a cgroups según lo especificado en su configuración.
Indirectamente a través de otro software que utiliza cgroups, como Docker , Firejail, LXC , [19] libvirt , systemd , Open Grid Scheduler/Grid Engine , [20] y lmctfy de Google, que se encuentra en desuso por razones de desarrollo .
La documentación del kernel de Linux contiene algunos detalles técnicos sobre la configuración y el uso de los grupos de control versión 1 [21] y versión 2. El comando [22] systemd-cgtop[23] se puede utilizar para mostrar los principales grupos de control según su uso de recursos.
Rediseño
El rediseño de cgroups comenzó en 2013, [24] con cambios adicionales introducidos por las versiones 3.15 y 3.16 del kernel de Linux. [25] [26] [27]
Aislamiento de espacios de nombres
Aunque técnicamente no forma parte del trabajo de cgroups, una característica relacionada del núcleo Linux es el aislamiento de espacios de nombres , donde los grupos de procesos se separan de modo que no puedan "ver" los recursos de otros grupos. Por ejemplo, un espacio de nombres PID proporciona una enumeración separada de identificadores de procesos dentro de cada espacio de nombres. También están disponibles los espacios de nombres mount, user, UTS (Unix Time Sharing), network y SysV IPC.
El espacio de nombres PID proporciona aislamiento para la asignación de identificadores de procesos (PID), listas de procesos y sus detalles. Si bien el nuevo espacio de nombres está aislado de otros procesos hermanos, los procesos en su espacio de nombres "principal" aún ven todos los procesos en los espacios de nombres secundarios, aunque con diferentes números de PID. [28]
El espacio de nombres de red aísla los controladores de interfaz de red (físicos o virtuales), las reglas de firewall de iptables , las tablas de enrutamiento, etc. Los espacios de nombres de red se pueden conectar entre sí utilizando el dispositivo Ethernet virtual "veth". [29]
El espacio de nombres "UTS" permite cambiar el nombre del host .
El espacio de montaje permite crear un diseño de sistema de archivos diferente o hacer que ciertos puntos de montaje sean de solo lectura. [30]
El espacio de nombres de usuario aísla los ID de usuario entre espacios de nombres. [31]
Espacio de nombres Cgroup [32]
Los espacios de nombres se crean con el comando "unshare" o syscall , o como indicadores "nuevos" en un syscall "clone". [33]
El subsistema "ns" se agregó al principio del desarrollo de cgroups para integrar espacios de nombres y grupos de control. Si se montaba el cgroup "ns", cada espacio de nombres también crearía un nuevo grupo en la jerarquía de cgroups. Este fue un experimento que luego se consideró inadecuado para la API de cgroups y se eliminó del núcleo.
Los espacios de nombres de Linux se inspiraron en la funcionalidad de espacios de nombres más generales que se usa ampliamente en Plan 9 de Bell Labs . [34]
Jerarquía unificada
Kernfs se introdujo en el núcleo Linux con la versión 3.14 en marzo de 2014, siendo el autor principal Tejun Heo. [35] Uno de los principales motivadores para un kernfs separado es el sistema de archivos cgroups. Kernfs se creó básicamente dividiendo parte de la lógica de sysfs en una entidad independiente, facilitando así a otros subsistemas del núcleo la implementación de su propio sistema de archivos virtual con manejo de conexión y desconexión de dispositivos, creación y eliminación dinámicas y otros atributos. El rediseño continuó en la versión 3.15 del núcleo Linux. [36]
Grupos de control de memoria del núcleo (kmemcg)
Los grupos de control de memoria del kernel ( kmemcg ) se fusionaron en la versión 3.8 (18 de febrero de 2013 ; hace 11 años ) de la línea principal del kernel de Linux . [37] [38] [39] El controlador kmemcg puede limitar la cantidad de memoria que el kernel puede utilizar para administrar sus propios procesos internos. ( 18-02-2013 )
cgroup conciencia del asesino OOM
El kernel de Linux 4.19 (octubre de 2018) introdujo la conciencia de cgroup de la implementación del eliminador OOM , que agrega la capacidad de eliminar un cgroup como una sola unidad y así garantizar la integridad de la carga de trabajo. [40]
Las principales distribuciones de Linux también lo adoptaron, como Red Hat Enterprise Linux (RHEL) 6.0 en noviembre de 2010, tres años antes de su adopción por parte del kernel principal de Linux. [42]
El 29 de octubre de 2019, el Proyecto Fedora modificó Fedora 31 para utilizar CgroupsV2 de forma predeterminada [43]
^ "Control Group v2 — La documentación del kernel de Linux". www.kernel.org . Consultado el 24 de junio de 2023 .
^ Jonathan Corbet (29 de mayo de 2007). "Contenedores de proceso". LWN.net.
^ de Jonathan Corbet (29 de octubre de 2007). "Notas de un contenedor". LWN.net . Consultado el 14 de abril de 2015. El nombre original "contenedores" se consideró demasiado genérico: este código es una parte importante de una solución de contenedores, pero está lejos de ser la solución completa. Por lo tanto, los contenedores ahora se han renombrado como "grupos de control" (o "cgroups") y se han fusionado para la versión 2.6.24.
^ "netfilter: x_tables: correspondencia de grupos de control de procesos ligeros". 23 de abril de 2014. Archivado desde el original el 24 de abril de 2014.
^ "cgroup: prepararse para la jerarquía unificada predeterminada". 13 de marzo de 2014.
^ ab "Documentation/cgroup-v2.txt tal como apareció en el kernel de Linux 4.5". 14 de marzo de 2016.
^ "cgroup v2: Múltiples jerarquías".
^ "Diferencia entre el kernel de Linux 4.4 y 4.5". 14 de marzo de 2016.
^ Jonathan Corbet (31 de julio de 2007). "Control del uso de memoria en contenedores". LWN.
^ Balbir Singh, Vaidynathan Srinivasan (julio de 2007). "Contenedores: desafíos con el controlador de recursos de memoria y su rendimiento" (PDF) . Simposio Linux de Ottawa.
^ Carvalho, André. "Uso de cgroups para limitar la E/S". andrestc.com . Consultado el 12 de septiembre de 2022 .
^ Luu, Dan. "El problema de la limitación de contenedores". danluu.com . Consultado el 12 de septiembre de 2022 .
^ Derr, Simon (2004). "CPUSETS" . Consultado el 12 de septiembre de 2022 .
^ "setrlimit(2) — Páginas del manual de Arch". man.archlinux.org . Consultado el 27 de noviembre de 2023 .
^ Jonathan Corbet (23 de octubre de 2007). «Espacio del núcleo: programación justa de usuarios para Linux». Network World. Archivado desde el original el 19 de octubre de 2013. Consultado el 22 de agosto de 2012 .
^ Kamkamezawa Hiroyu (19 de noviembre de 2008). Cgroup y controlador de recursos de memoria (PDF) . Simposio japonés sobre Linux. Archivado desde el original (diapositivas de la presentación en PDF) el 22 de julio de 2011.
^ de Dave Hansen. Gestión de recursos (diapositivas de la presentación en formato PDF) . Linux Foundation.
^ Matt Helsley (3 de febrero de 2009). "LXC: herramientas de contenedores de Linux". IBM developerWorks.
^ "Integración de grupos de control de Grid Engine". Scalable Logic. 22 de mayo de 2012.
^ "cgroups". kernel.org.
^ "Torvalds/Linux". GitHub . 13 de febrero de 2022.
^ "Systemd-cgtop".
^ "Todo sobre el núcleo de Linux: el rediseño de Cgroup". Linux.com . 15 de agosto de 2013. Archivado desde el original el 28 de abril de 2019 . Consultado el 19 de mayo de 2014 .
^ "La jerarquía de grupos de control unificados en 3.16". LWN.net . 11 de junio de 2014.
^ "Obtener actualizaciones de cgroup para 3.15 de Tejun Heo". kernel.org . 3 de abril de 2014.
^ "Obtener actualizaciones de cgroup para 3.16 de Tejun Heo". kernel.org . 9 de junio de 2014.
^ Pavel Emelyanov, Kir Kolyshkin (19 de noviembre de 2007). "Espacios de nombres PID en el kernel 2.6.24". LWN.net.
^ Jonathan Corbet (30 de enero de 2007). «Espacios de nombres de red». LWN.net.
^ Serge E. Hallyn, Ram Pai (17 de septiembre de 2007). "Aplicación de espacios de nombres de montaje". IBM developerWorks.
^ Michael Kerrisk (27 de febrero de 2013). "Espacios de nombres en funcionamiento, parte 5: espacios de nombres de usuario". Información sobre Linux de lwn.net desde la fuente.
^ "LKML: Linus Torvalds: Linux 4.6-rc1".
^ Janak Desai (11 de enero de 2006). "Documentación del kernel de Linux sobre la eliminación de archivos compartidos".
^ "El uso de espacios de nombres en Plan 9". 1992. Archivado desde el original el 6 de septiembre de 2014. Consultado el 15 de febrero de 2015 .
^ "kernfs, sysfs, driver-core: implementan la eliminación automática sincrónica". LWN.net . 3 de febrero de 2014 . Consultado el 7 de abril de 2014 .
^ "Árbol de fuentes del kernel de Linux: kernel/git/torvalds/linux.git: cgroups: convertir a kernfs". kernel.org . 11 de febrero de 2014 . Consultado el 23 de mayo de 2014 .
^ "memcg: infraestructura básica de contabilidad kmem". Código fuente de kernel.org . 18 de diciembre de 2012.
^ "memcg: agregar documentación sobre el controlador kmem". kernel.org . 18 de diciembre de 2012.
^ "Linux_4.19 - Principiantes en el kernel de Linux".
^ ab "Mesosphere llevará Kubernetes de Google a Mesos". Mesosphere.io. 10 de julio de 2014. Archivado desde el original el 6 de septiembre de 2015. Consultado el 13 de julio de 2014 .
^ "Notas de la versión 6.0" (PDF) . redhat.com . Consultado el 12 de septiembre de 2023 .
^ "1732114 – Modificar Fedora 31 para utilizar CgroupsV2 de forma predeterminada".
Enlaces externos
Documentación oficial del kernel de Linux sobre cgroups v1 y cgroups v2
Guía de administración de recursos de Red Hat sobre cgroups
Página de manual de Ubuntu sobre cgroups Archivado el 9 de agosto de 2021 en Wayback Machine
Espacios de nombres y grupos de control del kernel de Linux por Rami Rosen (2013)
Espacios de nombres y cgroups, la base de los contenedores Linux (incluido cgroups v2), diapositivas de una charla de Rami Rosen, Netdev 1.1, Sevilla, España, 2016
Comprensión de la nueva API de grupos de control, LWN.net , por Rami Rosen, marzo de 2016
Gestión de clústeres a gran escala en Google con Borg, abril de 2015, por Abhishek Verma, Luis Pedrosa, Madhukar Korupolu, David Oppenheimer, Eric Tune y John Wilkes
Objetos de trabajo, característica similar en Windows