Limita el uso de CPU y memoria de un comando con cgroups de Ubuntu.

Si un comando ralentiza tu escritorio Ubuntu o provoca que un servidor se quede sin memoria, coloca el comando y sus procesos secundarios en un cgroup gestionado por systemd con una cuota de CPU y un límite de memoria. En las versiones actuales de Ubuntu, systemd-run --scopeesta es la ruta práctica más corta: inicia el comando en un ámbito temporal y systemd aplica los límites mediante controles de cgroup.

El ejemplo que se muestra a continuación limita la carga de trabajo a la mitad de la capacidad de una CPU y 1 GiB de memoria. Estos límites se aplican a todo el ámbito, incluidos los procesos secundarios; no garantizan que el programa se ejecute a una velocidad determinada.

Por qué un proceso necesita un límite de cgroup

Un proceso con mucha actividad puede competir con aplicaciones interactivas, mientras que un proceso que consume mucha memoria puede provocar que la máquina se quede sin memoria o se bloquee. Un cgroup agrupa un proceso con sus descendientes para que el kernel pueda gestionar y controlar dicho grupo. El sistema systemd de Ubuntu proporciona una interfaz práctica para estos controles.

La configuración de la CPU y la memoria se comporta de manera diferente. CPUQuota=50%Limita el tiempo de CPU a la mitad de la capacidad de una CPU, promediado durante un período de planificación. Un valor de 200%representa hasta el tiempo de dos CPU cuando estén disponibles. Este es un límite máximo, no una prioridad de CPU ni una reserva. MemoryMax=1GEstablece un límite máximo estricto para la memoria asignada al cgroup; si la carga de trabajo no puede mantenerse por debajo de él, el kernel puede reclamar memoria o invocar una terminación por falta de memoria para un proceso en ese cgroup. Elija un límite con margen para la aplicación y sus procesos hijos.

1. Compruebe que Ubuntu esté utilizando cgroup v2.

Los sistemas Ubuntu que utilizan systemd suelen usar la jerarquía unificada de cgroup v2. Confirme la configuración activa antes de confiar en las rutas que se muestran más adelante:

stat -fc %T /sys/fs/cgroup
systemctl --version | head -n 1

El primer comando debería informar cgroup2fs. Si informa otro tipo de sistema de archivos, las rutas de archivo de cgroup v2 de este artículo no se aplican tal como están escritas. Es posible que las propiedades de systemd aún sean compatibles con una jerarquía diferente, pero utilice la documentación de la distribución correspondiente en lugar de copiar las rutas v2.

Compruebe también la versión exacta de systemd si se rechaza una propiedad. La documentación de Noble de Ubuntu describe CPUQuota=y MemoryMax=como ajustes de control de recursos; las versiones anteriores de Ubuntu pueden incluir versiones diferentes de systemd.

2. Iniciar la carga de trabajo dentro de un alcance limitado.

Ejecute el programa a través de systemd-run, sustituyendo su ejecutable y argumentos reales. Para un comando en el directorio actual, use ./y pase todos los argumentos después de --:

systemd-run --scope \
  -p CPUQuota=50% \
  -p MemoryMax=1G \
  -- ./my-program --input data.csv
Terminal de Ubuntu ejecutando systemd-run con CPUQuota establecido al 50 por ciento y MemoryMax establecido a 1G para un comando
Ejecuta un comando dentro de un ámbito transitorio de systemd con límites de CPU y memoria.

Para un comando propiedad del usuario, intente esto sudoprimero sin permisos de administrador. Si systemd informa que un controlador o propiedad solicitada no está disponible, es posible que el administrador del usuario no tenga permiso para delegarla; reintentar como root puede ser apropiado para una carga de trabajo a nivel de sistema, pero cambia el contexto de seguridad del comando. No ejecute un programa no confiable como root sin más. Si es necesario usar el administrador del sistema como root, úselo sudo systemd-run --scope ...solo después de considerar ese cambio.

La terminal permanece conectada al ámbito mientras se ejecuta el comando. Al pulsar la tecla Ctrl+CIntro, se interrumpe la operación en primer plano. El ámbito es transitorio y normalmente desaparece tras la finalización de los procesos. Es una forma práctica de iniciar un comando con ciertas limitaciones, en lugar de una política persistente para futuras ejecuciones.

3. Determinar el alcance e inspeccionar sus límites.

systemd-runImprime el nombre de la unidad que crea, normalmente algo como run-….scope. Mientras el comando aún se está ejecutando, lista el árbol de cgroup:

systemd-cgls

Localiza el ámbito transitorio y confirma que el programa objetivo y sus programas secundarios aparecen dentro de él. Esto es importante porque un programa secundario que se ejecute fuera de dicho ámbito no estará cubierto por el mismo límite de cgroup.

Árbol de cgroup de terminal que muestra un ámbito de ejecución transitorio que contiene un programa y dos procesos de trabajo.
Utilice el árbol cgroup para confirmar que el programa y sus procesos secundarios están agrupados bajo el ámbito transitorio.

Utilice el nombre del ámbito impreso en el siguiente comando. Reemplace run-abc.scopecon el nombre real:

systemctl show run-abc.scope \
  -p ControlGroup -p CPUQuotaPerSecUSec -p MemoryMax

CPUQuotaPerSecUSec=50000es consistente con una cuota del 50% cuando el período de cuota de systemd es de 100 ms; MemoryMax=1073741824es 1 GiB en bytes. Los valores en tiempo real son más útiles que asumir que cada host aceptará cada solicitud sin cambios, ya que los cgroups principales y los controladores disponibles pueden limitar el resultado efectivo.

Salida de systemctl show con valores de ControlGroup, cuota de CPU y memoria máxima para un ámbito transitorio
Verifique el grupo de control informado por el alcance y los límites de CPU y memoria configurados.

4. Verifique los archivos cgroup del kernel y ajústelos de forma segura.

La ControlGrouppropiedad proporciona la ruta del cgroup relativa a /sys/fs/cgroup. Guárdela en una variable de shell para que los comandos sigan la ruta asignada realmente en su máquina:

UNIT=run-abc.scope
CG=$(systemctl show "$UNIT" -p ControlGroup --value)
printf 'Group: %s\n' "$CG"
cat "/sys/fs/cgroup$CG/cpu.max"
cat "/sys/fs/cgroup$CG/memory.max"

En cgroup v2, cpu.maxcontiene una cuota y un período en microsegundos. Por ejemplo, 50000 100000significa 50 ms de tiempo de CPU en cada período de 100 ms. memory.maxMuestra el límite de memoria en bytes. Si faltan los archivos, confirme que el ámbito sigue activo y que el kernel está utilizando cgroup v2.

La terminal lee cpu.max y memory.max del ámbito systemd bajo el cgroup v2 de sysfs.
Lea los archivos cgroup v2 del kernel para verificar la cuota y el límite de memoria configurados.

Si inició una unidad de larga duración con nombre y necesita ajustar sus límites, systemd admite el cambio de propiedades de recursos en una unidad activa, por ejemplo sudo systemctl set-property --runtime my-worker.service CPUQuota=50% MemoryMax=1G. Esto se aplica al cgroup de ese servicio y requiere los privilegios adecuados. No adjunta un proceso arbitrario que ya se esté ejecutando solo porque se conozca su PID; para un proceso único, deténgalo limpiamente y reinícielo dentro del ámbito limitado. Para un servicio persistente, configure las propiedades en la unidad de servicio o en un archivo de configuración de systemd y reinícielo durante una ventana de mantenimiento apropiada.

Comprueba el resultado

Mantén la carga de trabajo activa mientras la inspeccionas. Confirma que systemd-cglsel proceso y sus procesos secundarios se encuentran dentro del ámbito previsto, que systemctl showse informan las propiedades solicitadas y que existen los archivos correspondientes cpu.maxcon memory.maxvalores finitos. Cuando el proceso finaliza, se elimina el ámbito transitorio, por lo que sus archivos cgroup pueden desaparecer.

Una cuota limita el tiempo de CPU, pero no garantiza un porcentaje fijo en un monitor de escritorio, y un límite de memoria estricto puede causar fallos si la aplicación necesita más de lo permitido. Si la carga de trabajo se vuelve inestable, deténgala y aumente el límite a un valor seguro medido o utilice un MemoryHigh=umbral de presión más flexible junto con uno más alto MemoryMax=. Para conocer el comportamiento exacto, consulte la documentación de systemd y del kernel instalada; las referencias autorizadas son el manual de ejecución de systemd de Ubuntu , el manual de control de recursos de systemd de Ubuntu y la documentación de cgroup v2 del kernel de Linux .

Dejar un comentario

Cómo convertir voltaje, corriente, kW, kVA y factor de potencia trifásicos.

Cómo convertir voltaje, corriente, kW, kVA y factor de potencia trifásicos.

Aprenda las fórmulas trifásicas equilibradas y convierta la tensión de línea, la corriente, los kW, los kVA y el factor de potencia paso a paso, con un ejemplo resuelto y límites para comprobar.

Limita el uso de CPU y memoria de un comando con cgroups de Ubuntu.

Limita el uso de CPU y memoria de un comando con cgroups de Ubuntu.

Ejecute una carga de trabajo dentro del ámbito de systemd con CPUQuota y MemoryMax, y luego verifique los límites a través de cgroup v2.

Encriptar el DNS ascendente de Pi-hole en Ubuntu Server 24.04

Encriptar el DNS ascendente de Pi-hole en Ubuntu Server 24.04

Configura dnscrypt-proxy como puente DoH local de Pi-hole en Ubuntu 24.04, con un oyente solo para localhost, selección de resolvedor y comprobaciones antes de cambiar el DNS.

Cómo hacer que los gestos del panel táctil de Ubuntu 24.04 funcionen en Wayland.

Cómo hacer que los gestos del panel táctil de Ubuntu 24.04 funcionen en Wayland.

Antes de solucionar problemas con las aplicaciones o el hardware, compruebe la configuración del panel táctil de Ubuntu, confirme que se utiliza Wayland y pruebe los gestos táctiles integrados de GNOME.

Crea un espejo RAID 1 de Debian 12 con mdadm.

Crea un espejo RAID 1 de Debian 12 con mdadm.

Cree y verifique una matriz de datos RAID 1 de dos discos para Debian 12, formatéela de forma segura y configúrela para que se ensamble y monte después del reinicio.

Cifrar la partición de intercambio de Debian 12 con una clave nueva en cada arranque.

Cifrar la partición de intercambio de Debian 12 con una clave nueva en cada arranque.

Configura el cifrado de clave aleatoria para una partición de intercambio existente en Debian 12, verifica la asignación activa de dm-crypt y comprende las ventajas y desventajas de la hibernación.

Cómo restringir el acceso de los usuarios SSH a directorios específicos en Ubuntu 24.04 (Guía de Chroot SFTP)

Cómo restringir el acceso de los usuarios SSH a directorios específicos en Ubuntu 24.04 (Guía de Chroot SFTP)

Restringir las cuentas SSH de Ubuntu 24.04 a carpetas SFTP designadas mediante chroot, permisos adecuados, reglas de coincidencia y pruebas seguras, sin otorgar acceso a la consola.

Libera el bloqueo APT de Ubuntu de forma segura y finaliza la actualización.

Libera el bloqueo APT de Ubuntu de forma segura y finaliza la actualización.

Descubre qué proceso posee el bloqueo del frontend dpkg de Ubuntu, deja que el trabajo de paquetes finalice y repara las instalaciones interrumpidas sin eliminar los archivos de bloqueo.

Cómo configurar instantáneas Btrfs automatizadas en Ubuntu Desktop

Cómo configurar instantáneas Btrfs automatizadas en Ubuntu Desktop

Configure instantáneas programadas del sistema Btrfs en Ubuntu Desktop con Timeshift, verifique la estructura de subvolúmenes de Ubuntu, elija la retención y comprenda qué no pueden proteger las instantáneas.

Cómo migrar Debian 12 a Testing sin romper dependencias

Cómo migrar Debian 12 a Testing sin romper dependencias

Planifica una migración más segura de Debian 12 a Testing: actualiza a través de Stable, realiza una copia de seguridad, limpia las fuentes APT, simula cambios en las dependencias y verifica qué ha cambiado.