Articulo de referencia

cgroups

v2: Tejun Heo"},"developer":{"wt":"Tejun Heo, Johannes Weiner, Michal Hocko, Waiman Long, Roman Gushchin, Chris Down et al."},"released":{"wt":"{{Start date and age|2007}}"...

cgroups (abreviatura 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 ] : § Controladores 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 finales 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, que se publicó en enero de 2008. [ 3 ] Desde entonces, los desarrolladores han añadido controladores para la propia asignación de memoria del kernel, [ 4 ] el firewall netfilter , [ 5 ] el OOM killer , [ 6 ] y muchas otras partes.

Un cambio importante en la historia de los cgroups es cgroup v2 , que elimina la capacidad de usar múltiples jerarquías de procesos y de discriminar entre hilos como se encontraba en el cgroup original (ahora llamado "v1"). [ 1 ] : § Problemas con v1 y fundamentos para v2 El trabajo en la jerarquía única y unificada comenzó con la reutilización de la jerarquía ficticia de v1 como un lugar para contener todos los controladores que aún no eran utilizados por otros en 2014. [ 7 ] cgroup v2 se fusionó en el kernel de Linux 4.5 (2016). [ 8 ]

Versiones

Existen dos versiones de cgroups. Pueden coexistir en un sistema.

  • La versión original de cgroups fue escrita por Paul Menage y Rohit Seth. Se integró al núcleo principal de Linux en 2007 (2.6.2). El desarrollo y mantenimiento de cgroups fue asumido entonces por Tejun Heo , quien implementó rediseños importantes sin alterar la interfaz (véase §  Rediseños de v1 ). Se renombró como "Control Group versión 1" (cgroup-v1) después de que cgroups-v2 apareciera en Linux 4.5. [ 9 ]
  • Tejun Heo descubrió que un rediseño posterior de v1 no podía continuar sin romper la interfaz. Como resultado, agregó un nuevo sistema separado llamado "Control Group versión 2" (cgroup-v2). A diferencia de v1, cgroup v2 tiene una sola jerarquía de procesos (porque un controlador solo puede asignarse a una jerarquía, los procesos en jerarquías separadas no pueden ser administrados por el mismo controlador; este cambio evita el problema). También elimina la capacidad de discriminar entre hilos, optando por trabajar en una granularidad de procesos en su lugar (deshabilitando un "abuso" del sistema que condujo a API complejas). [ 1 ] : § Problemas con v1 y Razones para v2 El kernel de Linux 4.5 lanzado el 14 de marzo de 2016 es la primera versión que admite cgroup v2. [ 8 ]

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 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:

Limitación de recursos
Los grupos se pueden configurar para que no excedan un límite de memoria configurado , que también incluye la caché del sistema de archivos , [ 10 ] [ 11 ] límite de ancho de banda de E/S, [ 12 ] límite de cuota de CPU, [ 13 ] límite de conjunto de CPU, [ 14 ] o número máximo de archivos abiertos . [ 15 ]
Priorización
Algunos grupos pueden obtener una mayor proporción de utilización de CPU [ 16 ] o rendimiento de E/S de 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 punto de control y reinicio [ 18 ]

Usar

Como ejemplo de uso indirecto, systemd asume acceso exclusivo a la funcionalidad cgroups.

Un grupo de control (abreviado como cgroup) es un conjunto de procesos que se rigen por los mismos criterios y están asociados a 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 la memoria, "cpuacct" contabiliza el uso de la CPU, etc.

Los grupos de control se pueden utilizar de múltiples maneras:

  • Accediendo manualmente al sistema de archivos virtual cgroup.
  • Mediante la creación y gestión de grupos sobre la marcha utilizando herramientas como cgcreate, cgexec, y cgclassify(de libcgroup).
  • Mediante el "demonio del motor de reglas" que puede mover automáticamente los 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 ya no se desarrolla .

La documentación del kernel de Linux contiene algunos detalles técnicos de la configuración y el uso de los grupos de control versión 1 [ 21 ] y versión 2. [ 1 ]

Interfaces

Ambas versiones de cgroup actúan a través de un pseudo-sistema de archivos ( cgrouppara v1 y cgroup2para v2). Como todos los sistemas de archivos, se pueden montar en cualquier ruta, pero la convención general es montar una de las versiones (generalmente v2) en /sys/fs/cgroupla ubicación predeterminada de sysfs/sys de . Como se mencionó antes, las dos versiones de cgroup pueden estar activas al mismo tiempo; esto también se aplica a los sistemas de archivos siempre que estén montados en una ruta diferente. [ 21 ] [ 1 ] Para la descripción a continuación, asumimos una configuración donde la jerarquía v2 se encuentra en /sys/fs/cgroup. La jerarquía v1, si alguna vez se requiere, se montará en una ubicación diferente.

En la inicialización, cgroup2 no debería tener grupos de control definidos, excepto el de nivel superior. En otras palabras, /sys/fs/cgroupno debería tener directorios, solo una serie de archivos que controlan el sistema en su conjunto. En este punto, al ejecutar el comando ls /sys/fs/cgroupse podría mostrar lo siguiente en un sistema de ejemplo:

  • cgroup.controllers
  • cgroup.max.depth
  • cgroup.max.descendants
  • cgroup.pressure
  • cgroup.procs
  • cgroup.stat
  • cgroup.subtree_control
  • cgroup.threads
  • cpu.pressure
  • cpuset.cpus.effective
  • cpuset.cpus.isolated
  • cpuset.mems.effective
  • cpu.stat
  • cpu.stat.local
  • io.cost.model
  • io.cost.qos
  • io.pressure
  • io.prio.class
  • io.stat
  • irq.pressure
  • memory.numa_stat
  • memory.pressure
  • memory.reclaim
  • memory.stat
  • memory.zswap.writeback
  • misc.capacity
  • misc.current
  • misc.peak

Estos archivos se nombran según los controladores que los gestionan. Por ejemplo, cgroup.*se gestiona el sistema cgroup y memory.*se gestiona el subsistema de memoria. Ejemplo: para solicitar al kernel 1 gigabyte de memoria desde cualquier parte del sistema, se puede ejecutar echo "1G swappiness=50" > /sys/fs/cgroup/memory.reclaim. [ 1 ]

Para crear un subgrupo, basta con crear un nuevo directorio dentro de un grupo existente (incluido el de nivel superior). Los archivos correspondientes a los controles disponibles para este grupo se crean automáticamente. [ 1 ] Por ejemplo, al ejecutar mkdir /sys/fs/cgroup/example; ls /sys/fs/cgroup/examplese generaría una lista de archivos muy similar a la anterior, pero con cambios notables. En un sistema de ejemplo, se añaden los siguientes archivos:

  • cgroup.events
  • cgroup.freeze
  • cgroup.kill
  • cgroup.type
  • cpu.idle
  • cpu.max
  • cpu.max.burst
  • cpu.pressure
  • cpu.uclamp.max
  • cpu.uclamp.min
  • cpu.weight
  • cpu.weight.nice
  • memory.current
  • memory.events
  • memory.events.local
  • memory.high
  • memory.low
  • memory.max
  • memory.min
  • memory.oom.group
  • memory.peak
  • memory.swap.current
  • memory.swap.events
  • memory.swap.high
  • memory.swap.max
  • memory.swap.peak
  • memory.zswap.current
  • memory.zswap.max
  • pids.current
  • pids.events
  • pids.events.local
  • pids.max
  • pids.peak

Estos cambios no son inesperados porque algunos controles y estadísticas solo tienen sentido en un subconjunto de procesos (por ejemplo, el nivel nice es la prioridad de CPU de los procesos en relación con el resto del sistema). [ 1 ]

Los procesos se asignan a subgrupos escribiendo en . El cgroup al que pertenece un proceso se puede encontrar leyendo el mismo archivo. [ 1 ]/proc/<PID>/cgroup

En los sistemas basados ​​en systemd , se predefine una jerarquía de subgrupos para encapsular cada proceso, tanto directo como indirecto, iniciado por systemd dentro de un subgrupo: esta es la base misma de cómo systemd gestiona los procesos. En el manual de Red Hat Enterprise Linux 7 se puede encontrar una explicación de la nomenclatura de estos grupos. [ 22 ] Red Hat también proporciona una guía para crear un archivo de servicio de systemd que hace que un proceso se ejecute en un cgroup independiente. [ 23 ]

systemd-cgtop[ 24 ] El comando se puede utilizar para mostrar los principales grupos de control según su uso de recursos.

coexistencia V1

En un sistema con v2, v1 aún puede montarse y acceder a los controladores que no utiliza v2. Sin embargo, un sistema moderno normalmente ya coloca todos los controladores en uso en v2, por lo que no hay ningún controlador disponible para v1, incluso si se crea una jerarquía. Es posible eliminar todos los usos de un controlador de v2 y asignárselo a v1, pero mover controladores entre jerarquías después de que el sistema esté en funcionamiento es engorroso y no se recomienda. [ 1 ]

Evoluciones importantes

Rediseños de la versión 1

El rediseño de cgroups comenzó en 2013, [ 25 ] con cambios adicionales introducidos por las versiones 3.15 y 3.16 del kernel de Linux. [ 26 ] [ 27 ] [ 28 ]

Los siguientes cambios se refieren al kernel anterior a las versiones 4.5/4.6, es decir, cuando se añadió cgroups-v2. En otras palabras, describen cómo se modificó cgroups-v1, aunque la mayoría de estos cambios también se han heredado en la versión 2 (al fin y al cabo, ambas comparten el mismo código base).

aislamiento de espacio de nombres

Aunque técnicamente no forma parte del funcionamiento de cgroups, una característica relacionada del kernel de Linux es el aislamiento de espacios de nombres , donde los grupos de procesos se separan de tal manera que no pueden acceder a los recursos de otros grupos. Por ejemplo, un espacio de nombres PID proporciona una enumeración independiente de los identificadores de proceso dentro de cada espacio de nombres. También están disponibles los espacios de nombres mount, user, UTS (Unix Time Sharing), network e IPC SysV.

  • El espacio de nombres PID proporciona aislamiento para la asignación de identificadores de proceso (PID), listas de procesos y sus detalles. Si bien el nuevo espacio de nombres está aislado de otros espacios hermanos, los procesos en su espacio de nombres "padre" aún ven todos los procesos en los espacios de nombres hijos, aunque con diferentes números de PID. [ 29 ]
  • El espacio de nombres de red aísla los controladores de interfaz de red (físicos o virtuales), las reglas del firewall iptables , las tablas de enrutamiento, etc. Los espacios de nombres de red se pueden conectar entre sí mediante el dispositivo Ethernet virtual "veth". [ 30 ]
  • El espacio de nombres "UTS" permite cambiar el nombre de host .
  • El espacio de nombres de montaje permite crear una disposición diferente del sistema de archivos o hacer que ciertos puntos de montaje sean de solo lectura. [ 31 ]
  • El espacio de nombres IPC aísla la comunicación entre procesos de System V entre los diferentes espacios de nombres.
  • El espacio de nombres de usuario aísla los ID de usuario entre espacios de nombres. [ 32 ]
  • Espacio de nombres Cgroup [ 33 ]

Los espacios de nombres se crean con el comando o llamada al sistema "unshare" , o como indicadores "new" en una llamada al sistema "clone". [ 34 ]

El subsistema "ns" se añadió 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 creaba también un nuevo grupo en la jerarquía de cgroups. Este experimento se consideró posteriormente inadecuado para la API de cgroups y se eliminó del kernel.

Los espacios de nombres de Linux se inspiraron en la funcionalidad de espacios de nombres más general utilizada ampliamente en el Plan 9 de Bell Labs . [ 35 ]

Conversión a kernfs

Kernfs se introdujo en el kernel de Linux con la versión 3.14 en marzo de 2014, siendo Tejun Heo su autor principal. [ 36 ] Uno de los principales motivos para la creación de un sistema de archivos independiente, kernfs, es el sistema de archivos cgroups. Kernfs se crea básicamente separando parte de la lógica de sysfs en una entidad independiente, facilitando así a otros subsistemas del kernel 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ámica, y otros atributos. Esto no afecta la forma en que se usa cgroups, pero facilita el mantenimiento del código. [ 37 ]

Nuevas características introducidas durante la versión 1

Grupos de control de memoria del kernel (kmemcg ) se fusionaron en la versión 3.8 (18 de febrerode 2013( 18-02-2013 )) delnúcleo principal de Linux. [ 38 ] [ 39 ] [ 4 ] El controlador kmemcg puede limitar la cantidad de memoria que el núcleo puede utilizar para administrar sus propios procesos internos.  

En 2014 se añadió soporte para la configuración de netfilter por grupo. [ 5 ]

La jerarquía unificada se añadió en 2014. Reutiliza la jerarquía ficticia de la versión 1 para contener todos los controladores que aún no han sido utilizados por otros. Esta jerarquía ficticia modificada se convertiría en la única jerarquía disponible en la versión 2. [ 7 ]

Cambios posteriores a la versión 2

A diferencia de la versión 1, cgroup v2 solo tiene una jerarquía de procesos y discrimina entre procesos, no entre hilos.

Conciencia de cgroup sobre el asesino OOM

El kernel de Linux 4.19 (octubre de 2018) introdujo la compatibilidad con cgroups en la implementación de OOM killer , lo que añade la capacidad de eliminar un cgroup como una sola unidad y, por lo tanto, garantizar la integridad de la carga de trabajo. [ 6 ]

Adopción

Varios proyectos utilizan cgroups como base, incluidos CoreOS , Docker (en 2013), Hadoop , Jelastic , Kubernetes , [ 40 ] lmctfy (Let Me Contain That For You), LXC (Linux Containers), systemd , Mesos y Mesosphere, [ 40 ] HTCondor y Flatpak .

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 el núcleo principal de Linux. [ 41 ]

El 29 de octubre de 2019, el Proyecto Fedora modificó Fedora 31 para usar CgroupsV2 por defecto. [ 42 ]

Véase también

Referencias

  1. 1 2 3 4 5 6 7 8 9 10 "Grupo de control v2" . docs.kernel.org .

    Secciones a las que se hace referencia en este documento:

    • Controladores
    • Problemas con la versión 1 y justificaciones para la versión 2.
  2. Jonathan Corbet (29 de mayo de 2007). "Contenedores de procesos" . LWN.net.
  3. 1 2 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.
  4. 1 2 "memcg: agregar documentación sobre el controlador kmem" . kernel.org . 18 de diciembre de 2012.
  5. 1 2 "netfilter: x_tables: coincidencia de grupo de control de procesos ligeros" . 23 de abril de 2014. Archivado del original el 24 de abril de 2014.
  6. 1 2 "Linux_4.19 - Principiantes del kernel de Linux" .
  7. 1 2 "cgroup: prepárese para la jerarquía unificada predeterminada" . 13 de marzo de 2014.
  8. 1 2 "Documentación/cgroup-v2.txt tal como aparece en el kernel de Linux 4.5" . 14 de marzo de 2016.
  9. "diferencias entre el kernel de Linux 4.4 y 4.5" . 14 de marzo de 2016.
  10. Jonathan Corbet (31 de julio de 2007). "Control del uso de la memoria en contenedores" . LWN.
  11. 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.
  12. ^ Carvalho, André (18 de octubre de 2017). "Uso de cgroups para limitar las E/S" . andrestc.com . Consultado el 12 de septiembre de 2022 .
  13. Luu, Dan. "El problema de la limitación de recursos en los contenedores" . danluu.com . Consultado el 12 de septiembre de 2022 .
  14. Derr, Simon (2004). "CPUSETS" . Recuperado el 12 de septiembre de 2022 .
  15. "setrlimit(2) — Páginas del manual de Arch" . man.archlinux.org . Consultado el 27 de noviembre de 2023 .
  16. Jonathan Corbet (23 de octubre de 2007). "Espacio del kernel: Planificación justa de usuarios para Linux" . Network World. Archivado del original el 19 de octubre de 2013. Recuperado el 22 de agosto de 2012 .
  17. Kamkamezawa Hiroyu (19 de noviembre de 2008). Cgroup y controlador de recursos de memoria (PDF) . Simposio Linux de Japón. Archivado del original (diapositivas de la presentación en PDF) el 22 de julio de 2011.
  18. 1 2 Hansen D, IBM Linux Technology Center (2009). Gestión de recursos (diapositivas de presentación en PDF) . Linux Foundation.
  19. Matt Helsley (3 de febrero de 2009). "LXC: Herramientas de contenedores Linux" . IBM developerWorks.
  20. "Integración de cgroups de Grid Engine" . Scalable Logic. 22 de mayo de 2012.
  21. 1 2 "Grupos de control versión 1" . docs.kernel.org .
  22. "1.2. Jerarquías de Cgroup predeterminadas | Guía de administración de recursos | Red Hat Enterprise Linux | 7 | Documentación de Red Hat" . docs.redhat.com .
  23. "Gestión de cgroups con systemd" . www.redhat.com .
  24. "Systemd-cgtop" .
  25. "Todo sobre el núcleo de Linux: el rediseño de Cgroup" . Linux.com . 15 de agosto de 2013. Archivado del original el 28 de abril de 2019. Consultado el 19 de mayo de 2014 .
  26. "La jerarquía unificada de grupos de control en la versión 3.16" . LWN.net . 11 de junio de 2014.
  27. "Obtener actualizaciones de cgroup para 3.15 de Tejun Heo" . kernel.org . 3 de abril de 2014.
  28. "Obtener actualizaciones de cgroup para 3.16 de Tejun Heo" . kernel.org . 9 de junio de 2014.
  29. ^ Pavel Emelyanov, Kir Kolyshkin (19 de noviembre de 2007). "Espacios de nombres PID en el kernel 2.6.24" . LWN.net.
  30. Jonathan Corbet (30 de enero de 2007). "Espacios de nombres de red" . LWN.net.
  31. Serge E. Hallyn, Ram Pai (17 de septiembre de 2007). "Aplicación de espacios de nombres de montaje" . IBM developerWorks.
  32. Michael Kerrisk (27 de febrero de 2013). "Espacios de nombres en funcionamiento, parte 5: Espacios de nombres de usuario" . lwn.net Linux Info from the Source.
  33. "LKML: Linus Torvalds: Linux 4.6-rc1" .
  34. Janak Desai (11 de enero de 2006). "Documentación del kernel de Linux sobre unshare" .
  35. "El uso de espacios de nombres en el Plan 9" . 1992. Archivado del original el 6 de septiembre de 2014. Recuperado el 15 de febrero de 2015 .
  36. "kernfs, sysfs, driver-core: implementa la autoeliminación síncrona" . LWN.net . 3 de febrero de 2014. Consultado el 7 de abril de 2014 .
  37. "Árbol fuente 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 .
  38. "memcg: infraestructura del controlador kmem" . Código fuente de kernel.org . 18 de diciembre de 2012.
  39. "memcg: infraestructura básica de contabilidad de kmem" . Código fuente de kernel.org . 18 de diciembre de 2012.
  40. 1 2 "Mesosphere llevará Kubernetes de Google a Mesos" . Mesosphere.io. 10 de julio de 2014. Archivado del original el 6 de septiembre de 2015. Recuperado el 13 de julio de 2014 .
  41. "Red Hat Enterprise Linux - Notas de la versión 6.0" (PDF) . redhat.com . Consultado el 12 de septiembre de 2023 .
  42. "1732114 – Modificar Fedora 31 para usar CgroupsV2 por defecto" .
  • 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 man de Ubuntu sobre cgroups. Archivada el 9 de agosto de 2021 en Wayback Machine.
  • Espacios de nombres y cgroups 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 , función similar en Windows