Tenemos una computadora cuya CPU tiene 32 núcleos y será utilizada por algunos usuarios diferentes para ejecutar programas. ¿Hay alguna forma de restringir el número de núcleos que cada usuario puede usar en cualquier momento para que un usuario no monopolice toda la potencia de la CPU?
18
Respuestas:
Si bien esto es posible , es complicado y casi seguro que es una mala idea. Si solo un usuario está usando la máquina en este momento, restringirlos a N núcleos es un desperdicio de recursos. Un enfoque mucho mejor sería ejecutar todo con
nice
:Esta es una gran herramienta que establece la prioridad de un proceso. Entonces, si solo un usuario está ejecutando algo, obtendrán tanto tiempo de CPU como necesiten, pero si alguien más lanza su propio trabajo (también conocido), serán amables y se compartirán entre sí. De esa forma, si todos sus usuarios inician comandos
nice 10 command
, nadie estará acaparando recursos (y nadie pondrá al servidor de rodillas).Tenga en cuenta que un valor agradable alto significa una prioridad baja. Esta es una medida de cuán agradables deberíamos ser y cuanto más agradables seamos, más compartiremos.
También tenga en cuenta que esto no ayudará a administrar la asignación de memoria, solo afecta la programación de la CPU. Por lo tanto, si varios usuarios inician múltiples procesos de uso intensivo de memoria, aún tendrá un problema. Si eso es un problema, debe buscar sistemas de colas adecuados, como el par .
fuente
nice
, por lo que describe, eso es exactamente lo que necesita.TL; DR : De una breve investigación parece que es posible restringir los comandos a un número específico de núcleos, sin embargo, en todos los casos, debe usar un comando que realmente aplique la restricción.
cgroups
Linux tiene
cgroups
que se utiliza con frecuencia exactamente con el fin de restringir los recursos disponibles para los procesos. A partir de una investigación muy breve, puede encontrar un ejemplo en Arch Wiki con la configuración de Matlab (un software científico) establecida en/etc/cgconfig.conf
:Para que dicha configuración surta efecto, debe ejecutar el proceso mediante un
cgexec
comando, por ejemplo, desde la misma página wiki:conjunto de tareas
¿Una pregunta relacionada sobre Ask Ubuntu y cómo limitar un proceso a un núcleo de CPU en Linux? [duplicado] en el sitio de Unix y Linux muestra un ejemplo de uso
taskset
para limitar las CPU para el proceso. En la primera pregunta, se logra mediante el análisis de todos los procesos para un usuario en particularEn la otra pregunta, un proceso se inicia por
taskset
sí mismo:Conclusión
Si bien es ciertamente posible limitar los procesos, parece que no es tan simple lograrlo para usuarios particulares. El ejemplo en la publicación de Ask Ubuntu vinculada requeriría un escaneo consistente para los procesos que pertenecen a cada usuario y se usan
taskset
en cada uno nuevo. Un enfoque mucho más razonable sería ejecutar selectivamente aplicaciones intensivas de CPU, ya sea a través decgexec
otaskset
; Tampoco tiene sentido restringir todos los procesos a un número específico de CPUS, especialmente para aquellos que realmente utilizan el paralelismo y la concurrencia para ejecutar sus tareas más rápido; limitarlos a un número específico de CPU puede tener el efecto de ralentizar el procesamiento. Además, como la respuesta de terdon mencionó es un desperdicio de recursosEjecutar aplicaciones seleccionadas a través de
taskset
ocgexec
requiere comunicarse con sus usuarios para hacerles saber qué aplicaciones pueden ejecutar, o crear scripts de envoltura que inicien aplicaciones seleccionadas a través detasksel
ocgexec
.Además, considere establecer el número de procesos que puede generar un usuario o grupo en lugar de establecer el límite en el número de CPU. Esto se puede lograr a través del
/etc/security/limits.conf
archivo .Ver también
fuente
sched_setaffinity(2)
dice la máscara de afinidad se conserva en todoexecve(2)
, y que un niño hereda elfork(2)
. Entonces, si configura el shell para un usuario (o su shell gráfico para una sesión X), todo lo que comiencen desde ese shell, por defecto, usará la misma máscara de afinidad.