Opero un sistema Linux que tiene muchos usuarios pero a veces ocurre un abuso; donde un usuario puede ejecutar un solo proceso que usa más del 80% de la CPU / Memoria.
Entonces, ¿hay alguna manera de evitar que esto suceda limitando la cantidad de uso de CPU que un proceso puede usar (al 10%, por ejemplo)? Soy consciente de ello cpulimit
, pero desafortunadamente aplica el límite a los procesos que le indico que limite (por ejemplo, procesos individuales). Entonces mi pregunta es, ¿cómo puedo aplicar el límite a todos los procesos en ejecución y procesos que se ejecutarán en el futuro sin la necesidad de proporcionar su identificación / ruta, por ejemplo?
centos
command-line
cpu
limit
Giovanni Mounir
fuente
fuente
cpulimit
junto con su script de búsqueda. Tenga una política y recomiende el uso decpulimit
, luego busque más del 10% y luego limite al 5% (por lo que se recomienda a los usuarios que lo usencpulimit
). Además, asegúrese de poder detectar múltiples procesos que sumen más del 10% para un solo usuario.cpulimit
es mucho mejor que simplemente matar el proceso, ya que el usuario puede reiniciarlo más adelante (como se señala en uno de sus comentarios). ¡Gracias!Respuestas:
Si bien puede ser un abuso para la memoria, no lo es para la CPU: cuando una CPU está inactiva, un proceso en ejecución (por "ejecución", quiero decir que el proceso no está esperando E / S u otra cosa) 100% de tiempo de CPU por defecto. Y no hay razón para imponer un límite.
Ahora, puede configurar prioridades gracias a
nice
. Si desea que se apliquen a todos los procesos para un usuario determinado, solo necesita asegurarse de que su shell de inicio de sesión se ejecute connice
: los procesos secundarios heredarán elnice
valor. Esto depende de cómo los usuarios inicien sesión. Vea Priorizar los inicios de sesión ssh (agradable) por ejemplo.Alternativamente, puede configurar máquinas virtuales. De hecho, establecer un límite por proceso no tiene mucho sentido ya que el usuario puede iniciar muchos procesos, abusando del sistema. Con una máquina virtual, todos los límites serán globales para la máquina virtual.
Otra solución es establecer
/etc/security/limits.conf
límites; consulte la página del comando man limit.conf (5). Por ejemplo, puede establecer el tiempo máximo de CPU por inicio de sesión y / o el número máximo de procesos por inicio de sesión. También puede establecerlomaxlogins
en 1 para cada usuario.fuente
agradable / renice
nice
es una gran herramienta para ajustes "únicos" a un sistema.cpulimit
cpulimit
si necesita ejecutar un trabajo intensivo de CPU y tener tiempo libre de CPU es esencial para la capacidad de respuesta de un sistema.cgroups
cgroups
aplicar límites a un conjunto de procesos, en lugar de a uno soloRecursos
http://blog.scoutapp.com/articles/2014/11/04/restricting-process-cpu-usage-using-nice-cpulimit-and-cgroups
fuente
cpu.cfs_quota_us
parámetro (consulte el manual )sudo cgclassify -g cpu:cpulimited 2315444
¿Miraste cgroups? Hay alguna información en Arch Wiki sobre ellos. Lea la sección sobre
cpu.shares
, parece que está haciendo lo que necesita, y pueden operar a nivel de usuario, por lo que puede limitar todos los procesos de usuario a la vez.fuente
Para la memoria, lo que estás buscando es
ulimit -v
. Tenga en cuenta queulimit
es heredado por los procesos secundarios, por lo que si lo aplica al shell de inicio de sesión del usuario en el momento del inicio de sesión, se aplica a todos sus procesos.Si todos sus usuarios usan
bash
como shell de inicio de sesión, poner la siguiente línea/etc/profile
debería hacer que todos los procesos de usuario tengan un límite estricto de 1 gigabyte (más exactamente, un millón de kilobytes):La opción
H
asegura que es un límite estricto, es decir, el usuario no puede volver a configurarlo después. Por supuesto, el usuario aún puede llenar memoria iniciando suficientes procesos a la vez.Para otros shells, deberá averiguar qué archivos de inicialización leen en su lugar (y qué otro comando en lugar de
ulimit
usar).Para la CPU, lo que deseas no parece tener sentido para mí. ¿Cuál sería el uso de dejar el 90% de la CPU sin usar cuando solo se está ejecutando un proceso? Creo que lo que realmente quieres es
nice
(y posiblementeionice
). Tenga en cuenta que, comoulimit
,nice
los procesos secundarios heredan los valores, por lo que es suficiente aplicarlo al shell de inicio de sesión en el momento del inicio de sesión. Supongo que eso también se aplica,ionice
pero no estoy seguro.fuente
nice
será lo suficientemente bueno como para hacer esto? Si es así, ¿crees que puedes mostrarme un ejemplo para lograr esto?Puesto que usted está indicando que cpulimit no sería práctico en su caso, entonces le sugiero que mire bonita , renice , y taskset , que pueden acercarse a lo que quiere lograr, aunque taskset permite establecer afinidad CPU de un proceso, por lo que podría no ser de ayuda inmediata en su caso.
fuente
nice
yrenice
? ¡Eso es bueno! He revisado sus páginas de manual, pero todavía no creo que puedan ayudar con esto, ya que todavía tiene que establecer una ID de proceso. Sin embargo, si pudiera darme un ejemplo que involucre estos paquetes para aplicar el límite en todos los procesos en ejecución / procesos futuros, ¡sería increíble!Como tus etiquetas tienen
centos
, puedes usarsystemd
.Por ejemplo, si desea limitar el usuario con ID de
1234
:sudo systemctl edit --force user-1234.slice
Luego escribe y guarda esto:
[Slice] CPUQuota=10%
La próxima vez que el usuario inicie sesión, afectará.
Las páginas man:
systemctl
,systemd.slice
,systemd.resource-control
...fuente
Si desea limitar los procesos que ya se iniciaron, deberá hacerlo uno por uno por PID, pero puede tener un script por lotes para hacerlo como el siguiente:
En mi caso
pypdfocr
lanza el codiciosotesseract
.Además, en algunos casos, si su CPU es bastante buena, puede usar una
renice
como esta:fuente