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

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

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

El problema que tengo es que uno de mis usuarios está utilizando una cantidad extrema de CPU. Más del 100% de manera consistente y está ralentizando mi servidor.

Otro problema es que son amigos y no son maliciosos, por lo que no quiero suspenderlos.

Además, el 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 utilizan ese uso extremo de la CPU.

Lo primero es ese archivo en esa ubicación, index.php. Otro es [php], sea lo que sea que eso signifique en WHM. Pero principalmente ese 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 no está disponible como 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 toda la cuenta de usuario.

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.

Respuesta1

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 utiliza suPHPcomo controlador, el proceso PHP se ejecutará como si lo hiciera la cuenta propietaria del archivo.

Si el propietario ejecuta el script, puede limitar el uso de la CPU a una cuenta agregándolo al /etc/security/limits.confarchivo. Si bien no puede usar esto para limitar exactamente el porcentaje de CPU, 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.

Nunca he usado esto (ejecuto CloudLinux), pero creo que la siguiente entradadeberíaayuda 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 tengo entendido, 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.

Respuesta2

Has probadogrupos C?


  • Instale el servicio sudo yum install libcgroupe inícielo sudo service cgconfig start.
  • Después de lo cual vea la configuración del subsistema para cgroups ejecutandosudo ls /cgroup

Crea un cgroup llamado limitcpu. Las líneas que comienzan con grupo crean cgroups y establecen parámetros del 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 deparámetros ajustablesque puedes usar para limitar el uso descarado de la CPU

Si las tareas en un cgroup deberían poder acceder a una sola CPU durante 0,1 (10%) segundos de cada 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 tareas a cgroups según los parámetros establecidos en el archivo /etc/cgrules.conf. Las entradas en el archivo /etc/cgrules.conf pueden adoptar 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 "@". Reemplazar subsystemscon una lista de nombres de subsistemas separados por comas, control_grouprepresenta una ruta al cgroup 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, cpuhog, se agregará al cgroup 'limitcpu' y se limitará en los subsistemas de la CPU.


En casos de uso avanzados, puede intentar utilizar una plantilla.

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

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

Luego use la plantilla usuarios/%g/%u en la tercera fila de una entrada /etc/cgrules.conf, que puede tener el siguiente aspecto:

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.

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

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 se definiera "usuarios de grupo/adminstaff/peter" en /etc/cgconfig.conf, se ignoraría en favor de "usuarios de plantilla/%g/% tú".

Tutorial de Digital Ocean.

Introducción a los Grupos de Control.

Respuesta3

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

información relacionada