17 votos

¿Cómo se puede restringir la cantidad de núcleos de CPU que cada usuario puede usar?

Tenemos una computadora cuya CPU tiene 32 núcleos y va a ser utilizada para ejecutar programas por varios usuarios diferentes. ¿Hay alguna forma de restringir la cantidad de núcleos que cada usuario puede usar en cualquier momento para que un usuario no monopolice toda la potencia de la CPU?

16voto

Stewart Puntos 1385

Si bien esto es posible, es complicado y casi sin duda una mala idea. Si sólo un usuario está utilizando la máquina en el momento, la restricción a N núcleos es un desperdicio de recursos. Un enfoque mucho mejor sería correr todo con nice:

NAME
       nice - run a program with modified scheduling priority

SYNOPSIS
       nice [OPTION] [COMMAND [ARG]...]

DESCRIPTION
       Run  COMMAND  with an adjusted niceness, which affects process scheduling.  With
       no COMMAND, print the current niceness.  Niceness values range  from  -20  (most
       favorable to the process) to 19 (least favorable to the process).

Esta es una gran herramienta que establece la prioridad de un proceso. Así que si sólo un usuario se está ejecutando algo, van a tener mucho tiempo de CPU, ya que necesitan, pero si alguien lanza su propia cuenta (también niced) de trabajo, que será agradable y a compartir unos con otros. De esa manera, si el que todos los usuarios ejecutar comandos con nice 10 command, nadie va a ser acaparador de recursos (y nadie va a traer el servidor a sus rodillas).

Tenga en cuenta que un alto valor de nice significa una baja prioridad. Esta es una medida de cuán agradable y la mejor que nosotros, más que nosotros compartimos.

También tenga en cuenta que esto no va a ayudar a gestionar la asignación de memoria, sólo affectes programación de CPU. Así que si varios usuarios lanzar múltiples intensivo de la memoria de los procesos, se va a tener un problema. Si eso es un problema, usted debe buscar en la cola de sistemas tales como par.

13voto

Serg Puntos 17677

TL;DR: a partir De las investigaciones en breve parece que es posible restringir los comandos específicos número de núcleos, sin embargo en todos los casos, usted tiene que utilizar un comando de la que realmente exige el cumplimiento de la restricción.

cgroups

Linux ha cgroups que se utiliza con frecuencia exactamente para el propósito de la restricción de recursos disponibles para los procesos. A partir de una breve investigación, usted puede encontrar un ejemplo en la Wiki de Arch con Matlab ( un software científico ) de configuración en /etc/cgconfig.conf:

group matlab {
    perm {
        admin {
            uid = username;
        }
        task {
            uid = username;
        }
    }

    cpuset {
        cpuset.mems="0";
        cpuset.cpus="0-5";
    }
    memory {
        memory.limit_in_bytes = 5000000000;
    }
}

En fin de este tipo de configuración surtan efecto, debe ejecutar el proceso a través de la cgexec comando, por ejemplo, desde la misma página de la wiki:

$ cgexec -g memory,cpuset:matlab /opt/MATLAB/2012b/bin/matlab -desktop

taskset

Una relacionada con la pregunta en Ask Ubuntu y Cómo limitar un proceso a un núcleo de la CPU en Linux? [duplicar] en Unix Y Linux sitio a mostrar un ejemplo de uso de taskset a limitar la Cpu para el proceso. En la primera pregunta, se logra a través del análisis de todos los procesos de un usuario en particular

$ ps aux | awk '/^housezet/{print $2}' | xargs -l taskset -p 0x00000001

En la otra pregunta, se inicia un proceso a través de la taskset sí:

$ taskset -c 0 mycommand --option  # start a command with the given affinity

Conclusión

Mientras que es ciertamente posible para limitar los procesos, parece que no es tan sencillo para lograr que los usuarios particulares. El ejemplo en los vínculos a Pedir Ubuntu post requeriría coherente de escaneo para los procesos que pertenecen a cada usuario y el uso de taskset en cada uno nuevo. Mucho más razonable sería para ejecutar de forma selectiva la CPU aplicaciones, ya sea a través de cgexec o taskset; asimismo, no tiene sentido restringir el acceso de todos los procesos específicos número de CPUS, especialmente para aquellos que realmente hacer uso de paralelismo y concurrencia para ejecutar sus tareas más rápido - que se limiten a determinadas número de Cpu puede tener el efecto de disminuir el procesamiento. Además, como terdon la respuesta mencionó que es un desperdicio de recursos

Ejecución de seleccionar las aplicaciones a través de taskset o cgexec requiere comunicarse con sus usuarios para hacerles saber lo que las aplicaciones que se pueden ejecutar, o la creación de contenedor de secuencias de comandos que se inicia seleccionar las aplicaciones a través de tasksel o cgexec.

Además, tenga en cuenta el número de ajuste de los procesos de un usuario o grupo puede desovar en lugar de establecer límites en el número de CPUs. Esto puede ser logrado a través de la /etc/security/limits.conf archivo.

Ver también

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: