Gestión de recursos mediante grupos de control
Explica cómo los grupos de control organizan los procesos, cómo systemd aplica las políticas de recursos y cuándo gestionar los cgroups manualmente.
Los grupos de control, denominados cgroups, son una función del núcleo de Oracle Linux que organiza los servicios systemd y, si es necesario, los procesos individuales (PIDs), en grupos jerárquicos para asignar recursos del sistema, como CPU, memoria y E/S.
Por ejemplo, si ha identificado tres procesos a los que se debe asignar tiempo de CPU en un ratio de 150:100:50, puede crear tres cgroups, cada uno con un peso de CPU que corresponda a uno de los tres valores del ratio y asignar el proceso adecuado a cada cgroup.
Utilice systemd para configurar cgroups.
La creación manual de directorios cgroup en el sistema de archivos virtual /sys/fs/cgroup (como se explica en este tema) puede ser útil para ilustrar conceptos subyacentes. Sin embargo, al utilizar este enfoque para escenarios específicos, como la depuración o la prueba temporales. Para la mayoría de los casos de uso, utilice systemd para configurar cgroups para garantizar una gestión de recursos correcta y persistente.
Por defecto, systemd crea un cgroup para lo siguiente:
-
Cada servicio
systemdconfigurado en el host.Por ejemplo, un servidor puede tener el grupo de control
NetworkManager.servicepara agrupar procesos que son propiedad del servicioNetworkManagery el grupo de controlfirewalld.servicepara agrupar procesos que son propiedad del serviciofirewalld, etc. -
Cada usuario (
UID) en el host.
La funcionalidad cgroup se monta como un sistema de archivos virtual en /sys/fs/cgroup. Cada cgroup tiene un directorio correspondiente en el sistema de archivos /sys/fs/cgroup. Por ejemplo, el cgroups creado por systemd para los servicios que gestiona se puede ver ejecutando el comando ls -l /sys/fs/cgroup/system.slice | grep ".service" como se muestra en el siguiente bloque de código de ejemplo:
ls -l /sys/fs/cgroup/system.slice | grep ".service"
...root root 0 Mar 22 10:47 atd.service
...root root 0 Mar 22 10:47 auditd.service
...root root 0 Mar 22 10:47 chronyd.service
...root root 0 Mar 22 10:47 crond.service
...root root 0 Mar 22 10:47 dbus-broker.service
...root root 0 Mar 22 10:47 dtprobed.service
...root root 0 Mar 22 10:47 firewalld.service
...root root 0 Mar 22 10:47 httpd.service
...
También puede crear cgroups personalizado mediante la creación de directorios en el sistema de archivos virtual /sys/fs/cgroup y la asignación de ID de proceso (PIDs) a diferentes cgroups según los requisitos del sistema. Sin embargo, la práctica recomendada es utilizar systemd para configurar cgroups en lugar de crear cgroups manualmente en /sys/fs/cgroup.
Para conocer el método recomendado de gestión de cgroups mediante systemd, consulte Using Systemd to Manage Control Groups.
Hay dos versiones de grupos de control disponibles en el núcleo de Linux.
- Grupos de control versión 1 (
cgroups v1) -
Proporciona una jerarquía de controlador por recurso. Cada recurso (CPU, memoria, E/S, etc.) tiene su propio árbol de grupos de control. Esto puede dificultar la coordinación entre los recursos. Utiliza una API heredada. Ahora se considera obsoleto, pero disponible para compatibilidad en sistemas compatibles.
- Grupos de control versión 2 (
cgroups v2) -
Utiliza una jerarquía unificada y única para todos los controladores, lo que permite una mejor coordinación entre recursos y una gestión más sencilla. Utiliza una API moderna y simplificada. Esta es la aplicación preferida y desarrollada activamente.
En la siguiente tabla, se resume la disponibilidad por versión de Oracle Linux:
| Versión de Oracle Linux | Cgroups v1 | Cgroups v2 |
|---|---|---|
| Oracle Linux 8 | Disponible (por defecto) | Disponible (activar manualmente) |
| Oracle Linux 9 | Disponible (compatibilidad) | Disponible (por defecto) |
| Oracle Linux 10 | No disponible (en desuso) | Disponible (por defecto) |
Para obtener más información sobre los grupos de control, consulte las páginas del manual cgroups(7) y sysfs(5).
Activar cgroups v2 en Oracle Linux 8
Verificación de cgroups v2 en Oracle Linux 9 y Oracle Linux 10
sudo mount -l | grep cgroup
cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,seclabel,nsdelegate,memory_recursiveprot)
Acerca de los controladores de recursos del núcleo
Los grupos de control gestionan el uso de recursos mediante controladores de recursos de núcleo. Un controlador de recursos de núcleo representa un único recurso, como el tiempo de CPU, la memoria, el ancho de banda de red o la E/S de disco.
Para identificar los controladores de recursos montados en el sistema, compruebe el contenido del archivo /procs/cgroups, por ejemplo, ejecute:
less /proc/cgroups
#subsys_name hierarchy num_cgroups enabled
cpuset 0 103 1
cpu 0 103 1
cpuacct 0 103 1
blkio 0 103 1
memory 0 103 1
devices 0 103 1
freezer 0 103 1
net_cls 0 103 1
perf_event 0 103 1
net_prio 0 103 1
hugetlb 0 103 1
pids 0 103 1
rdma 0 103 1
misc 0 103 1
Para obtener una explicación detallada de los controladores de recursos del núcleo de cgroups, consulte la página del manual cgroups(7).
Acerca del sistema de archivos del grupo de control
La funcionalidad cgroup se monta como un sistema de archivos jerárquico en /sys/fs/cgroup.
El directorio /sys/fs/cgroup también se denomina grupo de control raíz.
El contenido del directorio del grupo de control raíz varía ligeramente según la versión montada, pero en los sistemas que utilizan cgroups v2, normalmente se ven entradas similares a las siguientes:
ls /sys/fs/cgroup
cgroup.controllers cpuset.mems.effective memory.stat
cgroup.max.depth cpu.stat misc.capacity
cgroup.max.descendants dev-hugepages.mount sys-fs-fuse-connections.mount
cgroup.procs dev-mqueue.mount sys-kernel-config.mount
cgroup.stat init.scope sys-kernel-debug.mount
cgroup.subtree_control io.pressure sys-kernel-tracing.mount
cgroup.threads io.stat system.slice
cpu.pressure memory.numa_stat user.slice
cpuset.cpus.effective memory.pressure
mkdir para crear subdirectorios cgroup en el grupo de control raíz. Por ejemplo, puede crear los siguientes subdirectorios cgroup:/sys/fs/cgroup/MyGroups//sys/fs/cgroup/MyGroups/cgroup1/sys/fs/cgroup/MyGroups/cgroup2
La mejor práctica de diseño es que el elemento secundario
cgroups tenga al menos 2 niveles de profundidad dentro de /sys/fs/cgroup. Los ejemplos de la lista anterior siguen esta práctica utilizando el primer grupo secundario, MyGroups, como principal que contiene los diferentes cgroups necesarios para el sistema. Cada cgroup de la jerarquía contiene los siguientes archivos:
-
cgroup.controllers -
Este archivo de solo lectura muestra los controladores disponibles en el
cgroupactual. El contenido de este archivo coincide con el contenido del archivocgroup.subtree_controlen el archivo principalcgroup. -
cgroup.subtree_control -
Este archivo contiene los controladores en el archivo
cgroup.controllersque están activados para el secundario inmediatocgroupsdecgroupactual.Cuando un controlador (por ejemplo,
pids) está presente en el archivocgroup.subtree_control, los archivos de interfaz de controlador correspondientes (por ejemplo,pids.max) se crean automáticamente en los secundarios inmediatos delcgroupactual.
Para ver un procedimiento de ejemplo que crea grupos secundarios donde puede implementar la gestión de recursos para una aplicación, consulte Setting CPU Weight to Regulate Distribution of CPU Time.
Para eliminar un cgroup, asegúrese de que cgroup no contenga otros grupos secundarios y, a continuación, elimine el directorio. Por ejemplo, para eliminar el grupo secundario /sys/fs/cgroup/MyGroups/cgroup1, puede ejecutar el siguiente comando:
sudo rmdir /sys/fs/cgroup/MyGroups/cgroup1
Acerca de los modelos de distribución de recursos
Los siguientes modelos de distribución proporcionan formas de implementar el control o la regulación en la distribución de recursos para su uso por parte de cgroups v2:
- Pesos
-
En este modelo, se totalizan los pesos de todos los grupos de control. Cada grupo recibe una fracción del recurso en función de la relación entre el peso del grupo y el peso total.
Considere 10 grupos de control, cada uno con un peso de 100 para un total combinado de 1000. En este caso, cada grupo puede utilizar una décima parte de un recurso especificado.
El peso se utiliza normalmente para distribuir recursos sin estado. Para aplicar este recurso, se utiliza la opción
CPUWeight. - Límites
-
En este modelo, un grupo puede utilizar hasta la cantidad configurada de un recurso. Si un recurso, como el uso de memoria para un proceso, supera el límite, el núcleo puede detener el proceso con un mensaje de falta de memoria (om).
También puede comprometer en exceso los recursos para que la suma de los límites de los subgrupos pueda superar el límite del grupo principal. El compromiso excesivo supone que los recursos de todos los subgrupos no pueden alcanzar todos sus límites al mismo tiempo.
Para implantar este modelo de distribución, se suele utilizar la opción
MemoryMax. - Protecciones
-
En este modelo, a un grupo se le asigna un límite protegido. Si el uso de recursos del grupo permanece dentro de la cantidad protegida, el núcleo no puede privar al grupo del uso del recurso en favor de otros grupos que compiten por el mismo recurso. En este modelo, se permite un compromiso excesivo de recursos.
Para implantar este modelo, se suele utilizar la opción
MemoryLow. - Asignaciones
-
En este modelo, se asigna un importe absoluto específico para el uso de tipos finitos de recursos, como el presupuesto en tiempo real.
Gestión de cgroups v2 con sysfs
Muestra cómo crear y ajustar jerarquías de cgroups v2 directamente en /sys/fs/cgroup para la resolución de problemas o pruebas temporales.
Utilice systemd para gestionar toda la gestión de recursos siempre que sea posible. Para obtener más información, consulte Uso de Systemd para gestionar grupos de control.
Los ejemplos proporcionados aquí proporcionan el contexto para las acciones que systemd realiza en un sistema y muestran la funcionalidad fuera de systemd. La información proporcionada puede ser útil al depurar problemas con cgroups.
El procedimiento de ejemplo implica asignar tiempo de CPU entre cgroups que cada uno tiene diferentes PID de aplicación asignados. Los valores de PID de aplicación y tiempo de CPU se definen en los archivos cpu.weight y cgroup.procs de cada grupo.
El ejemplo también incluye los pasos necesarios para garantizar que el controlador cpu y sus archivos asociados, incluido el archivo cpu.weight, estén disponibles en cgroups que necesita crear en /sys/fs/cgroup.
Preparación del Grupo de Control para la Distribución del Tiempo de CPU
En este procedimiento, se describe cómo preparar manualmente un grupo de control para gestionar la distribución del tiempo de CPU. Tenga en cuenta que el enfoque recomendado para configurar grupos de control es utilizar systemd.
Definición del Peso de CPU para Regular la Distribución del Tiempo de CPU
Este procedimiento describe cómo establecer el peso de CPU para tres procesos diferentes mediante un grupo de control para gestionar la distribución del tiempo de CPU. Tenga en cuenta que el enfoque recomendado para configurar grupos de control es utilizar systemd.
Este procedimiento se basa en las siguientes suposiciones:
-
La aplicación que consume recursos de CPU en exceso es
sha1sum, como se muestra en la siguiente salida de ejemplo del comandotop:sudo top... PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 33301 root 20 0 18720 1756 1468 R 99.0 0.0 0:31.09 sha1sum 33302 root 20 0 18720 1772 1480 R 99.0 0.0 0:30.54 sha1sum 33303 root 20 0 18720 1772 1480 R 99.0 0.0 0:30.54 sha1sum 1 root 20 0 109724 17196 11032 S 0.0 0.1 0:03.28 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp ... -
Los procesos
sha1sumtienen los PID 33301, 33302 y 33303, como se muestra en la salida de ejemplo anterior.
Como requisito previo para el siguiente procedimiento, debe completar la preparación de cgroup-v2 como se describe en Preparing the Control Group for Distribution of CPU Time. Si omitió esas preparaciones, no puede completar este procedimiento.