¿Cómo limitar un usuario completo a menos del 10% de la CPU, no solo el proceso?

10

Estoy ejecutando centos, cpanel / whm, y tengo instalado cpulimit.

El problema que tengo es que uno de mis usuarios está usando una cantidad extrema de uso de CPU. Más del 100% de forma constante y está ralentizando mi servidor.

Otro problema es que son amigos y no maliciosos, así que no quiero suspenderlos.

Además, lo que es un problema es que no puedo limitarlo por proceso, porque este proceso cambia cada segundo. Es un proceso diferente cada vez.

Intenté lo siguiente pero no funciona.

cpulimit -l 10 -e /home/[username]/public_html/theirwebsite.org/index.php

Acabo de regresar

No process found
No process found
No process found
No process found
No process found
No process found

etc.

Hay dos cosas que usan ese uso extremo de la CPU.

Lo primero es ese archivo en esa ubicación index.php,. Otro es [php], lo que sea que eso signifique en WHM. Pero principalmente index.phpes el problema.

Si pudiera limitar ese index.phparchivo en esa ubicación, eso podría ayudar a mitigar este problema.

Por cierto, probé la -Pbandera pero eso no está disponible como una opción a diferencia de la documentación.

cpulimit -l 10 -P /home/[username]/public_html/theirwebsite.org/index.php

devoluciones

cpulimit: invalid option -- 'P'
Usage: cpulimit [OPTIONS...] TARGET
   OPTIONS
      -l, --limit=N          percentage of cpu allowed from 0 to 1600 (required)
      -v, --verbose          show control statistics
      -z, --lazy             exit if there is no target process, or if it dies
      -i, --include-children limit also the children processes
      -h, --help             display this help and exit
   TARGET must be exactly one of these:
      -p, --pid=N            pid of the process (implies -z)
      -e, --exe=FILE         name of the executable program file or path name
      COMMAND [ARGS]         run this command and limit it (implies -z)

Parece que tengo que hacerlo con la -ebandera.

Sin embargo, lo ideal sería limitar la cuenta de usuario completa.

Y sí, sé sobre cloudlinux, pero no puedo hacerlo ahora. Hasta que pueda hacer eso, necesito ayuda para hacerlo manualmente con algo que no requiera reiniciar el servidor.

usuario7783780
fuente

Respuestas:

1

Tiene razón en que no puede limitar a su amigo usando un proceso (PID), Apache genera un nuevo proceso (Trabajador) para cada solicitud que recibe, asignando un nuevo PID cada vez.

Dependiendo del controlador PHP que configure WHM -> MultiPHP Manager -> PHP Handlers, Apache ejecutará scripts PHP como él mismo o los ejecutará como el usuario propietario del archivo. Si lo usa suPHPcomo controlador, el proceso PHP se ejecutará como por la cuenta que posee el archivo.

Si el propietario ejecuta la secuencia de comandos, puede limitar el uso de la CPU a una cuenta agregándola al /etc/security/limits.confarchivo. Si bien no puede usar esto para limitar el porcentaje de CPU exactamente, puede modificar su valor 'agradable' para que sus procesos tengan una prioridad menor que otros procesos en el servidor. Como tal, otros procesos no tendrán que esperar tanto tiempo.

Nunca he usado esto yo mismo (ejecuto CloudLinux), pero creo que la siguiente entrada debería ayudar con el problema:

username    hard    priority    30

Esto establece la prioridad máxima para los procesos ejecutados por el usuario en 30. Por lo que entiendo, una prioridad más alta en realidad significa que otros procesos (con una prioridad más baja) obtienen más tiempo de CPU.

En mi servidor que ejecuta cPanel, la mayoría de los procesos tienen una prioridad de 20, por lo que, siguiendo la lógica anterior, establecer la prioridad para ese usuario en 30 debería permitir que otros procesos se ejecuten antes que estos procesos.

cascer1
fuente
7

¿Has probado Cgroups ?


  • Instala el servicio sudo yum install libcgroupe inícialo sudo service cgconfig start.
  • Después de lo cual ver la configuración del subsistema para los cgroups ejecutando sudo ls /cgroup

Crea un cgroup llamado limitcpu. Las líneas que comienzan con group crean cgroups y establecen parámetros de subsistema.

Ejemplo /etc/cgconfig.conf:

group limitcpu{

        cpu {
                cpu.shares = 200;
                # cpu.cfs_period_us
                # cpu.cfs_quota_us
        }
        memory {

        }
}

Para limitar la CPU, hay un par de parámetros ajustables que puede usar para limitar el uso evidente de la CPU

Si las tareas en un cgroup deberían poder acceder a una sola CPU durante 0.1 (10%) segundos de cada 1 segundo, configure cpu.cfs_quota_us en 100000 y cpu.cfs_period_us en 1000000.


Cgred es un servicio (que inicia el servicio cgrulesengd) que mueve las tareas a grupos c según los parámetros establecidos en el archivo /etc/cgrules.conf. Las entradas en el archivo /etc/cgrules.conf pueden tomar una de estas dos formas:

user subsystems control_group
user:command subsystems control_group

Donde usercon un nombre de usuario o un nombre de grupo con el prefijo "@". Reemplace subsystemscon una lista de nombres de subsistemas separados por comas, control_grouprepresenta una ruta al grupo c y commandrepresenta un nombre de proceso o una ruta de comando completa de un proceso.

Ejemplo etc / cgrules.conf:

*:firefox      cpu,memory      browsers/
@admin:memhog  memory          limitmem/
cpuhog         cpu             limitcpu/
  • firefoxLos procesos ejecutados por cualquier usuario se agregarán automáticamente a los navegadores cgroupy se limitarán en los subsistemas de CPU y memoria.

  • memhogLos procesos ejecutados por cualquier persona del admingrupo se agregarán al cgroup limitmemy se limitarán en el subsistema de memoria.

    - Su usuario, cpuhogserá agregado a cgroup 'limitcpu' y limitado en subsistemas de cpu.


En casos de uso anticipados, puede intentar utilizar una plantilla en su lugar.

Por ejemplo, especifique la siguiente plantilla en /etc/cgconfig.conf:

template users/%g/%u {
                     cpuacct{
                     }
                     cpu {
                        cpu.shares = "1000";
                     }
          }

Luego use la plantilla users /% g /% u en la tercera fila de una entrada /etc/cgrules.conf, que puede verse de la siguiente manera:

peter:ftp       cpu     users/%g/%u

Las %g and %uvariables utilizadas anteriormente se reemplazan automáticamente con el grupo y el nombre de usuario según el propietario del proceso ftp.

Si el proceso pertenece a Peter del grupo adminstaff, la ruta anterior se traduce a users/adminstaff/peter.

El servicio cgred luego busca este directorio, y si no existe, cgred lo crea y asigna el proceso a usuarios / adminstaff / peter / tareas.

Tenga en cuenta que las reglas de plantilla se aplican solo a las definiciones de plantillas en los archivos de configuración, por lo que incluso si "group users / adminstaff / peter" se definió en /etc/cgconfig.conf, se ignoraría a favor de "template users /% g /% u ".

Tutorial de Digital Ocean.

Introducción a los grupos de control.

Carrein
fuente
0

Probablemente pueda intentar configurar /etc/security/limits.conf allí, debería poder ajustar cuánto tiempo de CPU y memoria puede consumir un usuario. Para más detalles, consulte https://linux.die.net/man/5/limits.conf

sebastienvg
fuente