Cómo limitar el uso de CPU y RAM de un proceso con Cgroups en Ubuntu

En Ubuntu, la forma más segura de limitar la carga de trabajo con cgroups es permitir que systemd cree y administre su grupo de control. Úselo systemd-runpara un comando que esté iniciando ahora, o configure un servicio de systemd cuando el límite deba mantenerse después de los reinicios. Establezca CPUQuota=un límite máximo de tiempo de CPU y elija entre MemoryHigh=para la presión y MemoryMax=para un límite de memoria estricto. Estos límites se aplican a la unidad y sus procesos secundarios en conjunto.

Un cgroup (grupo de control) es un mecanismo del kernel de Linux que organiza los procesos para que el sistema pueda contabilizar y controlar su uso de recursos. El sistema systemd de Ubuntu ya coloca los servicios en cgroups, por lo que la mayoría de los usuarios no necesitan crear directorios /sys/fs/cgroupmanualmente. Los ejemplos que se muestran a continuación utilizan la interfaz resource-control de systemd y deben compararse con la versión de systemd instalada en su distribución de Ubuntu.

Un ejemplo de terminal al estilo Ubuntu que comprueba la versión de systemd y el tipo de montaje de cgroup2fs antes de establecer límites de recursos.
Maqueta ilustrativa de terminal para comprobar systemd y el montaje de cgroup v2. La versión y la salida mostradas son ejemplos, no resultados de una prueba.

Elija el control que se ajuste al problema.

MétodoLo que controlaMejor ajustePrincipal compensación
systemd-runalcance transitorioCuota de CPU y límites de memoria para un comando recién lanzado y sus descendientes.Un trabajo de compilación, script, importación o procesamiento por lotes único.El alcance es temporal y finaliza con la carga de trabajo; no se adjunta a un proceso arbitrario que ya esté en ejecución.
Configuración del servicio systemdRecursos para el cgroup del servicio, incluidos los procesos secundarios.Un demonio o aplicación que debería mantener los mismos límites después del reinicio.Requiere configuración del servicio y, normalmente, un reinicio para aplicar los nuevos ajustes.
Archivos cgroup v2 directosControladores a nivel de kernel como cpu.maxymemory.maxEntornos de ejecución de contenedores, administradores de cgroup delegados o administración especializadaEs un proceso más manual; systemd controla gran parte de la jerarquía de Ubuntu, y escribir en su árbol administrado puede entrar en conflicto con systemd o fallar debido a permisos y delegación.
niceoCPUWeight=Prioridad relativa de la CPU cuando los grupos compitenMantener las tareas en segundo plano con menor prioridad, permitiéndoles usar la CPU inactiva.Esto no supone un límite estricto para la CPU y no limita la memoria.

Para la mayoría de las máquinas Ubuntu interactivas, un ámbito transitorio es la opción reversible más rápida. Para un servicio de producción, utilice la unidad de servicio para que la política quede documentada y se restaure al arrancar. Utilice archivos cgroup directos solo cuando gestione deliberadamente una jerarquía delegada o cree un flujo de trabajo de contenedor/tiempo de ejecución.

Compruebe el sistema Ubuntu antes de establecer límites.

Primero, compruebe que systemd esté disponible y si el sistema de archivos cgroup es unified v2:

systemctl --version
stat -fc %T /sys/fs/cgroup

El resultado cgroup2fsdel segundo comando indica que se trata del sistema de archivos cgroup v2 unificado. Las versiones de Ubuntu y los sistemas personalizados pueden variar, por lo que no asuma que todas las máquinas tienen la misma jerarquía o las mismas características de systemd. También puede consultar la versión actual de systemd con el primer comando. Si el montaje de cgroup no es v2, algunas propiedades de los recursos o el comportamiento del controlador pueden diferir; consulte la página del manual de Ubuntu para la versión instalada antes de copiar una configuración.

Seleccione los valores tras medir la carga de trabajo. Deje margen para el resto del sistema y recuerde que los límites establecidos en un servicio de usuario también están sujetos a los límites de su segmento principal. Un cgroup hijo no puede recibir más recursos de los que permite su antecesor.

Limita un comando que estás a punto de iniciar

Para un comando en tu propia sesión de usuario, ejecútalo en un ámbito transitorio con systemd-run --user --scope. Por ejemplo:

Un ejemplo de terminal estilo Ubuntu que inicia un proceso Python con una cuota de CPU del 50 por ciento y umbrales de memoria de 700 MB y 900 MB.
Maqueta ilustrativa de terminal de un comando systemd-run único con una cuota de CPU, un umbral de presión de memoria y un límite máximo de memoria.
systemd-run --user --scope --unit=worker-capped \
  -p CPUQuota=50% \
  -p MemoryHigh=700M \
  -p MemoryMax=900M \
  -- python3 /opt/worker.py

Reemplaza el comando de Python con el programa que realmente necesitas ejecutar. Este ejemplo le da al cgroup un ancho de banda máximo de CPU equivalente a la mitad de una CPU, comienza a manejar la presión de memoria alrededor de 700 MiB y establece un máximo de memoria de 900 MiB. Los valores de memoria usan unidades base 1024 de systemd. Una cuota 100%representa hasta el tiempo de una CPU; 200%puede usar hasta el tiempo de dos CPU cuando estén disponibles. No significa un porcentaje de todos los núcleos de la computadora.

El comando se ejecuta en primer plano porque se trata de un ámbito. Al finalizar, la unidad transitoria desaparece. Elimínela --usersolo si tiene previsto utilizar el administrador del sistema y dispone de los privilegios necesarios; para una unidad transitoria de todo el sistema, ejecute el comando con sudolas opciones de comando adecuadas. Es posible que se rechacen los ajustes de recursos si el administrador o el controlador de cgroup no los admiten.

Establecer límites en un servicio persistente de systemd

Para un servicio como este worker.service, cree un archivo de inserción en lugar de editar el archivo de unidad del proveedor. Ejecute sudo systemctl edit worker.servicey agregue:

Un ejemplo de configuración de servicio systemd que contiene los ajustes CPUQuota, MemoryHigh y MemoryMax.
Ejemplo de configuración del servicio systemd con controles persistentes de CPU y memoria. Utilice el nombre real del servicio y los valores adecuados para su carga de trabajo.
[Service]
CPUQuota=50%
MemoryHigh=700M
MemoryMax=900M

Guarda el archivo drop-in, luego recarga las definiciones de unidades de systemd y reinicia el servicio para que el proceso se inicie bajo la política revisada:

sudo systemctl daemon-reload
sudo systemctl restart worker.service

Utilice un límite de memoria prudente. Si el servicio no puede recuperar suficiente memoria por debajo de este MemoryMaxlímite, el kernel podría activar el mecanismo de eliminación de procesos por falta de memoria dentro de ese grupo de control. Esto puede terminar uno o más procesos en el grupo de servicio e interrumpir su funcionamiento. Una estrategia más segura suele ser establecer este límite MemoryHighen un nivel donde la recuperación y la limitación de memoria sean aceptables, y luego establecer MemoryMaxun límite superior como límite final. Realice pruebas con cargas máximas realistas antes de implementar límites estrictos.

Verifique la unidad y observe su comportamiento.

Para el alcance transitorio, compruebe su estado utilizando el nombre de la unidad que proporcionó:

Un ejemplo de terminal que muestra systemctl status y systemd-cgtop monitoreando un alcance de carga de trabajo transitorio
Vista ilustrativa del estado y del monitor de cgroup. Las cifras de CPU y memoria que se muestran aquí no corresponden a mediciones de una ejecución real.
systemctl --user status worker-capped.scope
systemd-cgtop

Para un servicio del sistema, omítalo --useren el comando status. La vista de estado confirma que la unidad existe y está activa; systemd-cgtopmuestra el uso de recursos en tiempo real por grupo de control. Para inspeccionar las propiedades configuradas, consulte la unidad directamente, por ejemplo:

systemctl --user show worker-capped.scope \
  -p CPUQuotaPerSecUSec -p MemoryHigh -p MemoryMax

La memoria reportada para un cgroup no necesariamente coincide con la cifra del conjunto residente de un proceso: representa la memoria asignada al grupo y puede incluir a los descendientes de la carga de trabajo. Considere el monitoreo como evidencia del comportamiento de esta carga de trabajo a lo largo del tiempo, no como un único valor para optimizar indiscriminadamente.

¿Qué ocurre si el proceso ya está en marcha?

systemd-runInicia un nuevo comando dentro de una nueva unidad; no toma un PID existente arbitrario y lo mueve a ese ámbito. Si el proceso pertenece a un servicio systemd, aplique la configuración a ese servicio con un drop-in o, para un cambio temporal, use sudo systemctl set-property --runtime worker.service CPUQuota=50% MemoryHigh=700M MemoryMax=900M. El --runtimeformato es temporal y no reemplaza una configuración de servicio persistente.

Si el proceso es un programa normal en su sesión de escritorio, el método seguro y sencillo suele ser detenerlo y reiniciarlo systemd-run. Aplicar una propiedad a una porción más amplia, como toda su porción de usuario, puede afectar a muchas aplicaciones no relacionadas. Mover un proceso escribiendo su PID en un archivo cgroup requiere control de la jerarquía delegada correspondiente y debe respetar las reglas de ubicación de procesos de cgroup v2; no escriba en directorios administrados por systemd al azar.

Cómo elegir una política de CPU y memoria

  • ¿Necesitas un límite máximo de CPU? Elige CPUQuota=. Los valores más bajos reducen el consumo máximo de CPU, pero pueden ralentizar la finalización y aumentar el tiempo de espera.
  • ¿Necesitas solo prioridad baja? Considera CPUWeight=usar una cuota. El peso comparte la CPU relativamente bajo contención; no reserva un porcentaje fijo ni impide el uso de la CPU inactiva.
  • ¿Necesitas gestionar la presión de la memoria sin que se produzca un bloqueo inmediato? Establécelo MemoryHigh=como umbral de presión principal y observa la latencia y el comportamiento de recuperación.
  • ¿Necesitas un límite de contención final? Añade MemoryMax=suficiente margen para los picos normales. Prepárate para un comportamiento de falta de memoria (OOM) cuando no se pueda respetar el límite.
  • ¿Ya utilizas un contenedor? Opta por las opciones de CPU y memoria compatibles con el gestor de contenedores, que configuran los cgroups para ese contenedor y se ajustan a su ciclo de vida.

No existe un límite ideal único para cada carga de trabajo. Un proceso por lotes de escritorio puede tolerar una cuota baja y un límite de memoria moderado; un servicio sensible a la latencia puede necesitar mayor capacidad de CPU y un límite más alto MemoryHighpara evitar pausas relacionadas con la recuperación de memoria. Comience con una configuración conservadora, supervise el equipo durante un pico representativo y ajuste un parámetro a la vez.

Referencias

Dejar un comentario

How to Dual-Boot Ubuntu 24.04 and Windows 11 with BitLocker Enabled

How to Dual-Boot Ubuntu 24.04 and Windows 11 with BitLocker Enabled

Learn when Ubuntu 24.04 can dual-boot with BitLocker on, how to protect your recovery key, and the safe same-drive or separate-drive installation paths.

Cómo unir un cliente Pardus Linux a un dominio de Active Directory

Cómo unir un cliente Pardus Linux a un dominio de Active Directory

Une Pardus Linux a Active Directory con Pardus Domain Joiner. Comprueba el DNS y la hora, instala la interfaz de línea de comandos (CLI), únete con SSSD y verifica el acceso al dominio.

Cómo configurar Pardus Image Creator para la implementación de sistemas operativos personalizados

Cómo configurar Pardus Image Creator para la implementación de sistemas operativos personalizados

Aprende qué puede hacer Pardus Image Writer, cómo instalarlo y cómo implementar una imagen ISO personalizada verificada en una unidad USB de forma segura. Incluye instrucciones para la compilación y las pruebas.

Solucionar el error "Error al iniciar la carga de módulos del kernel" en el arranque de SLES

Solucionar el error "Error al iniciar la carga de módulos del kernel" en el arranque de SLES

Diagnostica y corrige los fallos del servicio systemd-modules-load.service en SLES localizando el módulo defectuoso, corrigiendo la configuración de arranque y reconstruyendo el initramfs solo cuando sea necesario.

Cómo migrar un escritorio Debian a un sistema operativo inmutable con OSTree

Cómo migrar un escritorio Debian a un sistema operativo inmutable con OSTree

Descubre por qué no se puede hacer que Debian sea inmutable para OSTree instalando un solo paquete, y luego migra de forma segura a un escritorio OSTree o planifica una imagen Debian personalizada.

Solucionar el problema de los gestos del panel táctil que no funcionan en Wayland en Ubuntu 24.04

Solucionar el problema de los gestos del panel táctil que no funcionan en Wayland en Ubuntu 24.04

Solucione el problema de los gestos táctiles de tres dedos que faltan en Ubuntu 24.04 Wayland revisando la configuración de GNOME, los eventos de libinput, las actualizaciones y las extensiones.

Cómo configurar un script de conmutación de salida de audio de PipeWire en Debian

Cómo configurar un script de conmutación de salida de audio de PipeWire en Debian

Crea un script fiable para alternar la salida de PipeWire en Debian con wpctl. Cambia entre altavoces, Bluetooth, USB o salidas HDMI sin necesidad de codificar identificadores manualmente.

Cómo configurar impresoras mediante CUPS en HamoniKR OS

Cómo configurar impresoras mediante CUPS en HamoniKR OS

Configura impresoras USB y de red en HamoniKR OS con CUPS. Agrega una cola, elige IPP sin controlador o un controlador de modelo, establece los valores predeterminados e imprime una página de prueba.

Cómo limitar el uso de CPU y RAM de un proceso con Cgroups en Ubuntu

Cómo limitar el uso de CPU y RAM de un proceso con Cgroups en Ubuntu

En Ubuntu, utilice los cgroups de systemd para limitar el tiempo de CPU y la memoria de un comando o servicio. Compare los ámbitos transitorios, los límites persistentes y las principales ventajas e inconvenientes.

Cómo traducir los elementos de la interfaz de usuario de Gooroom OS al inglés

Cómo traducir los elementos de la interfaz de usuario de Gooroom OS al inglés

Cambia los menús de Gooroom OS a inglés cuando haya soporte para ese idioma. Sigue la ruta de configuración de GNOME, la configuración regional alternativa de Debian y las comprobaciones de solución de problemas.