44.3.2. Establecimiento de límites de CPU a las aplicaciones mediante cgroups-v2
A veces una aplicación utiliza mucho tiempo de CPU, lo que puede afectar negativamente a la salud general de su entorno. Utilice control groups version 2 (cgroups-v2
) para configurar los límites de la CPU a la aplicación, y restringir su consumo.
Requisitos previos
- Una aplicación cuyo consumo de CPU se quiere restringir.
- Sección 44.1, “Entender los grupos de control”
Procedimiento
Evitar que
cgroups-v1
se monte automáticamente durante el arranque del sistema:grubby --update-kernel=/boot/vmlinuz-$(uname -r) --args="cgroup_no_v1=all"
# grubby --update-kernel=/boot/vmlinuz-$(uname -r) --args="cgroup_no_v1=all"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow El comando añade un parámetro de línea de comandos del kernel a la entrada de arranque actual. El parámetro
cgroup_no_v1=all
evita quecgroups-v1
se monte automáticamente.Como alternativa, utilice el parámetro de línea de comandos del kernel
systemd.unified_cgroup_hierarchy=1
para montarcgroups-v2
durante el arranque del sistema por defecto.NotaRHEL 8 soporta tanto
cgroups-v1
comocgroups-v2
. Sin embargo,cgroups-v1
está activado y montado por defecto durante el proceso de arranque.- Reinicie el sistema para que los cambios surtan efecto.
Opcionalmente, verifique que la funcionalidad de
cgroups-v1
ha sido desactivada:mount -l | grep cgroup
# mount -l | grep cgroup tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,seclabel,mode=755) cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Si
cgroups-v1
se ha desactivado con éxito, la salida no muestra ninguna referencia "tipo cgroup", excepto las que pertenecen asystemd
.Monte
cgroups-v2
en cualquier lugar del sistema de archivos:mount -t cgroup2 none <MOUNT_POINT>
# mount -t cgroup2 none <MOUNT_POINT>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Opcionalmente, verifique que la funcionalidad de
cgroups-v2
ha sido montada:mount -l | grep cgroup2
# mount -l | grep cgroup2 none on /cgroups-v2 type cgroup2 (rw,relatime,seclabel)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow La salida del ejemplo muestra que
cgroups-v2
se ha montado en el directorio/cgroups-v2/
.Opcionalmente, inspeccione el contenido del directorio
/cgroups-v2/
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow El directorio
/cgroups-v2/
, también llamado grupo de control raíz, contiene algunos archivos de interfaz (empezando porcgroup
) y algunos archivos específicos del controlador comocpuset.cpus.effective
.Identifique los ID de proceso (PID) de las aplicaciones que desea restringir en el consumo de la CPU:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow La salida de ejemplo del programa
top
revela quePID 5473
y5439
(aplicación ilustrativasha1sum
ycpu_load_generator
) consumen muchos recursos, concretamente la CPU. Ambas son aplicaciones de ejemplo utilizadas para demostrar la gestión de la funcionalidad decgroups-v2
.Habilitar los controladores relacionados con la CPU:
echo "+cpu" > /cgroups-v2/cgroup.subtree_control echo "+cpuset" > /cgroups-v2/cgroup.subtree_control
# echo "+cpu" > /cgroups-v2/cgroup.subtree_control # echo "+cpuset" > /cgroups-v2/cgroup.subtree_control
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Los comandos anteriores habilitan los controladores
cpu
ycpuset
para los grupos de subcontrol inmediatos del grupo de control raíz/cgroups-v2/
.Cree un subdirectorio en el directorio
/cgroups-v2/
creado anteriormente:mkdir /cgroups-v2/Example/
# mkdir /cgroups-v2/Example/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow El directorio
/cgroups-v2/Example/
representa un subgrupo de control, donde se pueden colocar procesos específicos y aplicar varios límites de CPU a los procesos. Además, el paso anterior habilitó los controladorescpu
ycpuset
para este grupo de subcontrol.En el momento de la creación de
/cgroups-v2/Example/
, se crearán en el directorio algunos archivos de la interfazcgroups-v2
y archivos específicos del controladorcpu
ycpuset
.Opcionalmente, inspeccione el grupo de control recién creado:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow La salida del ejemplo muestra archivos como
cpuset.cpus
ycpu.max
. Los archivos son específicos de los controladorescpuset
ycpu
que usted habilitó para los grupos de control hijos directos de la raíz (/cgroups-v2/
) utilizando el archivo/cgroups-v2/cgroup.subtree_control
. Además, hay archivos generales de interfaz de controlcgroup
comocgroup.procs
ocgroup.controllers
, que son comunes a todos los grupos de control, independientemente de los controladores habilitados.Por defecto, el grupo de subcontrol recién creado hereda el acceso a todos los recursos de la CPU del sistema sin límite.
Asegúrese de que los procesos que desea limitar compiten por el tiempo de CPU en la misma CPU:
echo "1" > /cgroups-v2/Example/cpuset.cpus
# echo "1" > /cgroups-v2/Example/cpuset.cpus
Copy to Clipboard Copied! Toggle word wrap Toggle overflow El comando anterior asegura los procesos que usted colocó en el grupo de subcontrol
Example
, compiten en la misma CPU. Esta configuración es importante para que el controladorcpu
se active.ImportanteEl controlador
cpu
sólo se activa si el grupo de subcontrol correspondiente tiene al menos 2 procesos, que compiten por el tiempo en una sola CPU.Configurar los límites de la CPU del grupo de control:
echo "200000 1000000" > /cgroups-v2/Example/cpu.max
# echo "200000 1000000" > /cgroups-v2/Example/cpu.max
Copy to Clipboard Copied! Toggle word wrap Toggle overflow El primer valor es la cuota de tiempo permitida en microsegundos para que todos los procesos colectivamente en un subgrupo de control puedan ejecutarse durante un período (especificado por el segundo valor). Durante un solo periodo, cuando los procesos de un grupo de control agotan colectivamente todo el tiempo especificado por esta cuota, se estrangulan durante el resto del periodo y no se les permite ejecutarse hasta el siguiente periodo.
El comando de ejemplo establece los límites de tiempo de la CPU para que todos los procesos colectivamente en el grupo de subcontrol
Example
puedan funcionar en la CPU sólo durante 0,2 segundos de cada 1 segundo.Opcionalmente, verifique los límites:
cat /cgroups-v2/Example/cpu.max 200000 1000000
# cat /cgroups-v2/Example/cpu.max 200000 1000000
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Añada los PID de las aplicaciones al grupo de subcontrol
Example
:echo "5473" > /cgroups-v2/Example/cgroup.procs echo "5439" > /cgroups-v2/Example/cgroup.procs
# echo "5473" > /cgroups-v2/Example/cgroup.procs # echo "5439" > /cgroups-v2/Example/cgroup.procs
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Los comandos de ejemplo garantizan que las aplicaciones deseadas se conviertan en miembros del grupo de subcontrol
Example
y, por tanto, no superen los límites de CPU configurados para el grupo de subcontrolExample
.Compruebe que las aplicaciones se ejecutan en el grupo de control especificado:
cat /proc/5473/cgroup /proc/5439/cgroup 1:name=systemd:/user.slice/user-1000.slice/user@1000.service/gnome-terminal-server.service 0::/Example 1:name=systemd:/user.slice/user-1000.slice/user@1000.service/gnome-terminal-server.service 0::/Example
# cat /proc/5473/cgroup /proc/5439/cgroup 1:name=systemd:/user.slice/user-1000.slice/user@1000.service/gnome-terminal-server.service 0::/Example 1:name=systemd:/user.slice/user-1000.slice/user@1000.service/gnome-terminal-server.service 0::/Example
Copy to Clipboard Copied! Toggle word wrap Toggle overflow El ejemplo anterior muestra que los procesos de las aplicaciones deseadas se ejecutan en el grupo de subcontrol
Example
.Inspeccione el consumo actual de la CPU de sus aplicaciones estranguladas:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Obsérvese que el consumo de CPU de
PID 5439
yPID 5473
ha disminuido al 10%. El subgrupo de controlExample
limita sus procesos al 20% del tiempo de CPU de forma colectiva. Como hay 2 procesos en el grupo de control, cada uno puede utilizar el 10% del tiempo de CPU.
Recursos adicionales
- Para obtener información sobre el concepto de grupos de control, consulte Sección 44.1, “Entender los grupos de control”.
-
Para más información sobre los controladores de recursos, consulte la sección Sección 44.2, “Qué son los controladores de recursos del núcleo” y la página del manual
cgroups(7)
. -
Para más información sobre el sistema de archivos virtual
/sys/fs/
, consulte la página del manualsysfs(5)
.