Como limitar um usuário inteiro a menos de 10% da CPU, não apenas do processo?

Como limitar um usuário inteiro a menos de 10% da CPU, não apenas do processo?

Estou executando centos, cpanel/whm e tenho o cpulimit instalado.

O problema que estou tendo é que um dos meus usuários está usando uma quantidade extrema de CPU. Mais de 100% de forma consistente e isso está deixando meu servidor lento.

Outro problema é que eles são amigos e não são maliciosos, então não quero suspendê-los.

Além disso, o problema é que não posso limitá-lo por processo, porque esse processo muda a cada segundo. É um processo diferente a cada vez.

Eu tentei o seguinte, mas não funciona.

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

Acabei de ser devolvido,

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

etc.

Há duas coisas que estão usando esse uso extremo da CPU.

A primeira coisa é aquele arquivo naquele local, index.php. Outro é [php], seja lá o que isso signifique no WHM. Mas principalmente index.phpé o problema.

Se eu pudesse limitar esse index.phparquivo naquele local, isso poderia ajudar a atenuar esse problema.

A propósito, tentei o -Psinalizador, mas ele não está disponível como opção, diferentemente da documentação.

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

retorna

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 tenho que fazer isso com a -ebandeira.

Idealmente, porém, gostaria de limitar toda a conta do usuário.

E sim, eu sei sobre o cloudlinux, mas não posso fazer isso agora. Até que eu possa fazer isso, preciso de ajuda para fazer isso manualmente com algo que não requer a reinicialização do servidor.

Responder1

Você está certo ao dizer que não pode limitar seu amigo usando um processo (PID), o Apache gera um novo processo (Worker) para cada solicitação que recebe, atribuindo um novo PID a cada vez.

Dependendo de qual manipulador PHP você configurou WHM -> MultiPHP Manager -> PHP Handlers, o Apache executará scripts PHP como ele mesmo ou como o usuário proprietário do arquivo. Se você usar suPHPcomo manipulador, o processo PHP será executado pela conta proprietária do arquivo.

Se o script for executado pelo proprietário, você poderá limitar o uso da CPU a uma conta adicionando-a ao /etc/security/limits.confarquivo. Embora você não possa usar isso para limitar exatamente a porcentagem da CPU, você pode modificar seu valor 'agradável' para que seus processos tenham uma prioridade mais baixa do que outros processos no servidor. Como tal, outros processos não terão que esperar tanto.

Eu nunca usei isso (eu executo o CloudLinux), mas acredito que a seguinte entradadeveajude com o problema:

username    hard    priority    30

Isso define a prioridade máxima para processos executados pelo usuário em 30. Pelo que entendi, uma prioridade mais alta significa, na verdade, que outros processos (com prioridade mais baixa) obtêm mais tempo de CPU.

No meu servidor executando cPanel, a maioria dos processos tem prioridade 20, portanto, seguindo a lógica acima, definir a prioridade desse usuário como 30 deve permitir que outros processos sejam executados antes desses processos.

Responder2

Você tentouGrupos C?


  • Instale o serviço sudo yum install libcgroupe inicie-o sudo service cgconfig start.
  • Depois disso, visualize a configuração do subsistema para os cgroups executandosudo ls /cgroup

Crie um cgroup chamado limitcpu. Linhas que começam com group criam cgroups e definem parâmetros do subsistema.

Exemplo /etc/cgconfig.conf:

group limitcpu{

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

        }
}

Para limitação de CPU, existem algunsparâmetros ajustáveisque você pode usar para limitar o uso flagrante da CPU

Se as tarefas em um cgroup puderem acessar uma única CPU por 0,1 (10%) segundos a cada 1 segundo, defina cpu.cfs_quota_us como 100000 e cpu.cfs_period_us como 1000000.


Cgred é um serviço (que inicia o serviço cgrulesengd) que move tarefas para cgroups de acordo com os parâmetros definidos no arquivo /etc/cgrules.conf. As entradas no arquivo /etc/cgrules.conf podem assumir uma destas duas formas:

user subsystems control_group
user:command subsystems control_group

Onde usercom um nome de usuário ou nome de grupo prefixado com o caractere "@". Substitua subsystemspor uma lista separada por vírgulas de nomes de subsistemas, control_grouprepresenta um caminho para o cgroup e commandrepresenta um nome de processo ou um caminho de comando completo de um processo.

Exemplo etc/cgrules.conf:

*:firefox      cpu,memory      browsers/
@admin:memhog  memory          limitmem/
cpuhog         cpu             limitcpu/
  • firefoxos processos executados por qualquer usuário serão automaticamente adicionados aos navegadores cgroupe limitados nos subsistemas de CPU e memória.

  • memhogprocessos executados por qualquer pessoa do admingrupo serão adicionados ao cgroup limitmeme limitados na memória do subsistema.

    - Seu usuário, cpuhog, será adicionado ao cgroup 'limitcpu' e limitado em subsistemas de CPU.


Em casos de uso antecipados, você pode tentar utilizar um modelo.

Por exemplo, especifique o seguinte modelo em /etc/cgconfig.conf:

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

Em seguida, use o modelo users/%g/%u na terceira linha de uma entrada /etc/cgrules.conf, que pode ter a seguinte aparência:

peter:ftp       cpu     users/%g/%u

As %g and %uvariáveis ​​usadas acima são automaticamente substituídas por grupo e nome de usuário dependendo do proprietário do processo FTP.

Se o processo pertencer a Peter do grupo adminstaff, o caminho acima será traduzido para users/adminstaff/peter.

O serviço cgred então procura esse diretório e, se ele não existir, o cgred o cria e atribui o processo a users/adminstaff/peter/tasks.

Observe que as regras de modelo se aplicam apenas a definições de modelos em arquivos de configuração, portanto, mesmo que "group users/adminstaff/peter" fosse definido em /etc/cgconfig.conf, ele seria ignorado em favor de "template users/%g/% você".

Tutorial da Digital Ocean.

Introdução aos grupos de controle.

Responder3

Você provavelmente pode tentar configurar /etc/security/limits.conf lá, você poderá ajustar quanto tempo de CPU e memória um usuário pode consumir. Para detalhes vejahttps://linux.die.net/man/5/limits.conf

informação relacionada