
Un proceso que consume repentinamente el 99% de los recursos de la CPU a las 2 a.m. puede hacer que un servidor estable se vuelva lento y no responda. La buena noticia es que Linux le ofrece varias formas de evitar que ocurra esta situación antes de que se convierta en un problema.
Tal vez una tarea de respaldo, una compilación de software o una aplicación que funciona mal comience a utilizar todos los recursos de CPU disponibles. En muchos casos, detener el proceso no es la mejor solución. Es posible que desee limitar la cantidad de CPU o memoria que puede utilizar para que el resto del sistema siga funcionando normalmente.
En este artículo, aprenderá cuatro formas prácticas de controlar el uso de CPU y memoria de los procesos de Linux.
Por qué quieres limitar un proceso
Los servidores Linux suelen ejecutar muchos servicios simultáneamente, como servidores web, bases de datos, trabajos programados, Herramientas de monitoreoy aplicaciones en segundo plano. Si un proceso comienza repentinamente a consumir todos los recursos de CPU disponibles, todo el sistema puede volverse lento y dejar de responder.
En algunos casos, detener el proceso no es la solución adecuada. Por ejemplo, es posible que esté realizando una copia de seguridad de una base de datos de gran tamaño, una conversión de vídeo, una compilación de software o un trabajo de procesamiento de datos que deba completarse con éxito. Puede limitar la cantidad de CPU o memoria permitida para su uso en lugar de detenerla.
La misma idea se aplica al uso de la memoria. Si una aplicación pierde memoria o consume más RAM de lo esperado, establecer límites puede evitar que afecte a otros servicios hasta que esté disponible una solución permanente.
Método 1: use cpulimit para limitar el uso de la CPU
Cuando necesite una forma rápida y sencilla de limitar el consumo de CPU, límite de CPU es una de las herramientas más simples disponibles. Funciona pausando y reanudando temporalmente un proceso varias veces por segundo, manteniendo el uso promedio de la CPU por debajo de un porcentaje específico.
Instalar límite de CPU En Linux, utilice las siguientes instrucciones para su distribución de Linux específica.
sudo apt install cpulimit [On Debian, Ubuntu and Mint] sudo dnf install cpulimit [On RHEL/CentOS/Fedora and Rocky/AlmaLinux] sudo emerge -a sys-apps/cpulimit [On Gentoo Linux] sudo apk add cpulimit [On Alpine Linux] sudo pacman -S cpulimit [On Arch Linux] sudo zypper install cpulimit [On OpenSUSE] sudo pkg install cpulimit [On FreeBSD]
Necesita el ID del proceso de la aplicación en ejecución antes de aplicar el límite.
Por ejemplo, para encontrar el PID de Firefox:
pidof firefox
Ejemplo de salida:
3271
Limite el uso de CPU de un proceso al 30%:
sudo cpulimit --pid 3271 --limit 30
Esto es lo que significan estas opciones:
--pid3271 es para el proceso con PID 3271.--limit30 Limita el uso de la CPU al 30% de un único núcleo de CPU.
En sistemas con múltiples núcleos de CPU, el porcentaje se calcula por núcleo. Por ejemplo, 30% En un sistema de cuatro núcleos es aproximadamente equivalente a 7,5% La capacidad total de CPU de la máquina.
Para ejecutarlo en segundo plano, agregue un signo comercial. (&) al final:
sudo cpulimit --pid 3271 --limit 30 &
Si recibes «proceso no encontrado”, es posible que el proceso se haya reiniciado con un nuevo PIDasí que simplemente corre pidof nuevamente y use el PID actualizado.
También puede iniciar nuevas aplicaciones a las que se les aplican límites de CPU.
sudo cpulimit --limit 40 -e make -- make -j4
En este comando:
-e makeDígale a cpulimit qué archivo ejecutable monitorear.--limit 40Limite el uso de la CPU al 40%.make -j4Inicie el trabajo de compilación.
Este método es particularmente útil en sistemas agrupados donde el trabajo de compilación no debería consumir todos los recursos de CPU disponibles.
a pesar de límite de CPU Excelente para acelerar la CPU, pero no controla el uso de la memoria. En el siguiente método, utilizaremos las herramientas de programación integradas de Linux para reducir la prioridad de la CPU de un proceso para que, naturalmente, obtenga menos recursos cuando el sistema esté ocupado.
Si esto le ayuda a evitar que los procesos consuman su servidor, Sigo jugando al topo con un trabajo que está fuera de control.
Método 2: utilice nice y renice para reducir la prioridad de programación
a diferencia de límite de CPUlimitar proactivamente el uso de la CPU, nice y renice Funciona al afectar la forma en que el programador de Linux asigna el tiempo de CPU. En lugar de poner un límite estricto al uso, simplemente le dicen al sistema: «Este proceso no es tan importante como otros procesos.Cuando el sistema está ocupado, los viajes de menor prioridad obtienen menos ciclos de CPU.
Esto hace nice Ideal para tareas en segundo plano como copias de seguridad, archivado, procesamiento de registros o trabajos por lotes que no deberían interferir con el trabajo interactivo, p. Sesión SSHeditor o servicio web.
este nice La prioridad varía entre:
-20= Prioridad más alta (ejecutar primero).= Prioridad predeterminada.19= prioridad más baja (último en ejecutarse).
Los usuarios normales sólo pueden aumentar el valor agradable (prioridad más baja), pero sólo el root puede asignar valores negativos.
Ejecutar instrucciones con prioridad reducida, por ejemplo, ejecutar una tarea de respaldo con un buen valor. 15lo que significa que el sistema sólo le dará tiempo de CPU cuando un proceso de mayor prioridad no lo esté utilizando.
nice -n 15 tar -czf /backup/home.tar.gz /home/
Si el proceso ya se está ejecutando, puedes ajustar su prioridad usando renice:
sudo renice -n 19 -p 3271
Ejemplo de salida:
3271 (process ID) old priority 0, new priority 19
aquí:
-n 19Establezca un nuevo buen valor (prioridad más baja).-p 3271ID del proceso de destino.
Es importante entender nice No limita directamente el uso de la CPU. Aún se pueden utilizar procesos de baja prioridad. 100% CPU (si el sistema está inactivo). Sin embargo, cuando otros viajes requieran tiempo de CPU, el programador los priorizará sobre los trabajos de baja prioridad.
Método 3: utilice cgroups para establecer límites estrictos de memoria y CPU en el nivel central
este cgroups (grupo de control) es la base de la gestión de recursos de Linux. A diferencia de herramientas similares límite de CPU o niceoperando a nivel de usuario, cgroups Los límites se aplican directamente en el núcleo de Linux, lo que significa que los procesos no pueden eludir o «creciendo«Estas restricciones.
Primero, verifique si su sistema está funcionando. cgrupos v2:
mount | grep cgroup
Si ves algo como esto, estás usando la versión 2:
cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate,memory_recursiveprot)
Ahora crea un nuevo cgroup para tu proceso:
sudo mkdir /sys/fs/cgroup/mygroup
Para limitar grupos a 512 MB de RAM:
echo "536870912" | sudo tee /sys/fs/cgroup/mygroup/memory.max
Permita el 20% de un núcleo de CPU (200.000 de 1.000.000):
echo "200000 1000000" | sudo tee /sys/fs/cgroup/mygroup/cpu.max
Ahora asigne un proceso en ejecución (PID 3271) a este cgroup:
echo 3271 | sudo tee /sys/fs/cgroup/mygroup/cgroup.procs
Este proceso ahora está estrictamente limitado a Memoria de 512MB y 20% Un núcleo de CPU. Si intenta asignar más memoria que el límite superior, el kernel OOM El asesino dispara y lo elimina.
Si desea que el proceso tenga memoria limitada en lugar de eliminarse, configure memory.swap.max llegar Deshabilite el intercambio para grupos y use solo la política de archivos de intercambio. Pase lo que pase, no puede escapar de la jaula.
Si esto finalmente hace que cgroups funcione para usted, Todavía me pregunto por qué OOM está eliminando su contenedor.
Método 4: utilice systemd para limitar servicios mediante directivas de recursos
Si tu proceso es como systemd servicio, que suele ser la opción más limpia y fácil de producir. systemd utiliza el control de recursos incorporado para manejar todo por usted en lugar de lidiar manualmente con PID o cgroups.
Debajo del capó, systemd Todavía usando cgrupos v2pero los administra automáticamente para que no tengas que crear ni asignar nada manualmente.
Digamos que quieres limitar nginx servicio, por lo que no puede consumir más del 50% de la CPU y 1 GB de RAM. Por lo tanto, necesita crear un archivo superpuesto incrustado sin editar la unidad original:
sudo systemctl edit nginx
Añadir al archivo:
CPUQuota=50% MemoryMax=1G
Vuelva a cargar systemd y reinicie el servicio:
sudo systemctl daemon-reload sudo systemctl restart nginx
Verifique que se haya aplicado la restricción:
sudo systemctl show nginx | grep -E 'CPUQuota|MemoryMax'
Ejemplo de salida:
CPUQuota=50% MemoryMax=1073741824
Qué significan estas configuraciones:
CPUQuota=50%– Limite los servicios a la mitad de la capacidad de un núcleo de CPU (systemd normaliza esto en todos los núcleos).MemoryMax=1G– Establecer límites de memoria dura. Si el servicio excede este valor, el núcleo activará el OOM Killer del servicio.
Para límites de memoria más suaves que activan el registro de advertencia pero no finalizan el proceso, use Alta memoria En cambio, limita las asignaciones y registra eventos sin finalizar el servicio.
si ves CPUQuota=0 En el resultado, la directiva no se aplica, así que verifique si guardó la anulación en /etc/systemd/system/nginx.service.d/override.conf Y el demonio se recargó y funcionó limpiamente.
Si esto evita que nginx se coma todo el servidor, Antes de que nadie aprenda por las malas.
Método 5: utilice ulimit para establecer límites de recursos por sesión y por usuario
este ulimit es una forma simple pero poderosa de controlar una sesión de shell o lo que puede hacer un usuario. a diferencia de cgroups o systemdno gestiona servicios de todo el sistema. En cambio, funciona a nivel de shell, lo que significa que afecta todo lo que inicia desde esa sesión de terminal.
Esto es particularmente útil para servidores compartidos donde desea proteger su sistema de un solo usuario que ejecuta procesos sin control o consume demasiados recursos.
Para ver qué acciones están permitidas para la sesión actual:
ulimit -a
Ejemplo de salida:
core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 7824 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 7824 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
Para limitar la cantidad de memoria que puede utilizar un proceso en este shell:
ulimit -v 1048576
Cuando se configura esta opción, cualquier programa iniciado desde este terminal no puede exceder el límite de memoria definido.
Para imponer restricciones en las sesiones de inicio de sesión, debe establecer restricciones de seguridad en todo el sistema.
sudo nano /etc/security/limits.conf
Luego agregue nuevas entradas, por ejemplo:
deploy soft nproc 200 deploy hard nproc 500 deploy hard as 2097152
Qué significan estas restricciones:
soft nproc 200: Advertir, pero no hacer cumplir, en 200 procesoshard nproc 500: Límite máximo de 500 procesoshard as 2097152: El límite superior estricto del espacio de direcciones es 2 GB, en KB
este deploy Los usuarios verán estas restricciones cada vez que inicien sesión. valor límite cambios /etc/security/limits.conf Se requiere una nueva sesión de inicio de sesión para que surta efecto. Si los cambia y prueba inmediatamente en el mismo shell, nada cambiará.
Si ulimit acaba de salvar su servidor compartido de una bomba fork, Antes de que nadie más lo descubra por las malas.
en conclusión
Ahora tiene cinco utilidades para controlar cuánta CPU y memoria pueden usar sus procesos de Linux:
cpulimitSe utiliza para limitar rápidamente el uso de CPU de un proceso en ejecución.niceyreniceSe utiliza para reducir la prioridad de programación para que el proceso obtenga menos ciclos de CPU bajo carga.cgroups v2Límites estrictos a nivel de núcleo en CPU y memoriasystemdDirectivas para limpieza, control de recursos a nivel de servicio.ulimitRestricciones de seguridad por usuario y por sesión
Ahora seleccione un proceso (trabajo de copia de seguridad, script de compilación, remitente de registros) en su sistema y limítelo a cpulimit o un systemd Cuota de CPU. Observe lo que sucede con la carga del sistema antes y después. Este ejercicio de diez minutos te mantendrá activo más que leyendo sobre él.
¿Alguna vez ha experimentado una situación en la que un único proceso fuera de control derribó un servidor compartido? Deja un comentario a continuación: ¿Cuál fue el proceso y cómo te recuperaste?
Si este artículo fue útil, Con alguien de tu equipo.









