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


10

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

O problema que estou enfrentando é que um dos meus usuários está usando uma quantidade extrema de uso da CPU. Mais de 100% de forma consistente e está diminuindo a velocidade do meu servidor.

Outro problema é que eles são amigos e nã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 todas as vezes.

Eu tentei o seguinte, mas não funciona.

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

Acabei de voltar,

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 é esse arquivo naquele local index.php,. Outro é [php], o que quer que isso signifique no WHM. Mas principalmente index.phpo problema é esse.

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

A propósito, tentei a -Pflag, mas isso não está disponível como uma opção, ao contrário 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 eu tenho que fazer isso com a -ebandeira.

Idealmente, porém, eu gostaria de limitar a conta de usuário inteira.

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

Respostas:


1

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

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

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

Eu nunca usei isso sozinho (eu executo o CloudLinux), mas acredito que a seguinte entrada deve ajudar com o problema:

username    hard    priority    30

Isso define a prioridade máxima para os processos executados pelo usuário como 30. Pelo que entendi, uma prioridade mais alta significa que outros processos (com uma prioridade mais baixa) recebem mais tempo de CPU.

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


7

Você já experimentou o Cgroups ?


  • Instale o serviço sudo yum install libcgroupe inicie-o sudo service cgconfig start.
  • Após o qual, visualize a configuração do subsistema para os cgroups executando sudo ls /cgroup

Crie um cgroup chamado limitcpu. As linhas que começam com o grupo 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 limitar a CPU, existem alguns parâmetros ajustáveis que 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.


O Cgred é um serviço (que inicia o serviço cgrulesengd) que move as tarefas para o 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 um nome de grupo prefixado com o caractere "@". Substitua subsystemspor uma lista separada por vírgula 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.

  • memhogos processos executados por qualquer pessoa no admingrupo serão adicionados ao cgroup limitmeme limitados no subsistema de memória.

    - Seu usuário cpuhog,, será adicionado ao cgroup 'limitcpu' e limitado nos subsistemas da cpu.


Em casos de uso avançados, 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 ser da seguinte maneira:

peter:ftp       cpu     users/%g/%u

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

Se o processo pertencer a peter do grupo adminstaff, o caminho acima será convertido em users/adminstaff/peter.

O serviço cgred 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 às definições de modelos nos arquivos de configuração, portanto, mesmo que "group users / adminstaff / peter" tenha sido definido em /etc/cgconfig.conf, isso será ignorado em favor de "template users /% g /% você".

Tutorial da Digital Ocean.

Introdução aos Grupos de Controle.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.