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.php
arquivo naquele local, isso poderia ajudar a atenuar esse problema.
A propósito, tentei o -P
sinalizador, 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 -e
bandeira.
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 suPHP
como 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.conf
arquivo. 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 libcgroup
e inicie-osudo service cgconfig start
. - Depois disso, visualize a configuração do subsistema para os cgroups executando
sudo 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 user
com um nome de usuário ou nome de grupo prefixado com o caractere "@". Substitua subsystems
por uma lista separada por vírgulas de nomes de subsistemas, control_group
representa um caminho para o cgroup e command
representa 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/
firefox
os processos executados por qualquer usuário serão automaticamente adicionados aos navegadorescgroup
e limitados nos subsistemas de CPU e memória.memhog
processos executados por qualquer pessoa doadmin
grupo serão adicionados ao cgrouplimitmem
e 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 %u
variá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ê".
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