Eu opero um sistema Linux que possui muitos usuários, mas às vezes ocorre um abuso; onde um usuário pode executar um único processo que consome mais de 80% da CPU / Memória.
Portanto, existe uma maneira de impedir que isso aconteça, limitando a quantidade de uso da CPU que um processo pode usar (para 10%, por exemplo)? Estou ciente cpulimit
, mas infelizmente aplica o limite aos processos que eu o instruo a limitar (por exemplo, processos únicos). Portanto, minha pergunta é: como posso aplicar o limite a todos os processos em execução e processos que serão executados no futuro sem a necessidade de fornecer seu ID / caminho, por exemplo?
centos
command-line
cpu
limit
Giovanni Mounir
fonte
fonte
cpulimit
em conjunto com seu script de pesquisa. Tenha uma política e recomende o uso decpulimit
, procure por mais de 10% e depois limite a 5% (para que os usuários sejam incentivados a usarcpulimit
). Além disso, verifique se você pode detectar vários processos, somando mais de 10% para um único usuário.cpulimit
é muito melhor do que apenas matar o processo, pois ele pode ser reiniciado pelo usuário mais tarde (conforme indicado em um de seus comentários). Obrigado!Respostas:
Embora possa ser um abuso de memória, não é para a CPU: quando uma CPU está ociosa, um processo em execução (por "execução", quero dizer que o processo não está esperando por E / S ou outra coisa) será necessário. 100% de tempo da CPU por padrão. E não há razão para impor um limite.
Agora, você pode definir prioridades graças a
nice
. Se você deseja que eles se apliquem a todos os processos para um determinado usuário, você só precisa garantir que o shell de logon seja executado comnice
: os processos filhos herdarão onice
valor. Isso depende de como os usuários efetuam login. Consulte Priorizar logins ssh (simpáticos), por exemplo.Como alternativa, você pode configurar máquinas virtuais. De fato, definir um limite por processo não faz muito sentido, pois o usuário pode iniciar muitos processos, abusando do sistema. Com uma máquina virtual, todos os limites serão globais para a máquina virtual.
Outra solução é estabelecer
/etc/security/limits.conf
limites; consulte a página do manual limits.conf (5). Por exemplo, você pode definir o tempo máximo da CPU por login e / ou o número máximo de processos por login. Você também pode definirmaxlogins
1 para cada usuário.fonte
nice / renice
nice
é uma ótima ferramenta para ajustes únicos em um sistema.cpulimit
cpulimit
se você precisar executar um trabalho intensivo da CPU e ter tempo livre da CPU é essencial para a capacidade de resposta de um sistema.cgroups
cgroups
aplicar limites a um conjunto de processos, em vez de apenas umRecursos
http://blog.scoutapp.com/articles/2014/11/04/restricting-process-cpu-usage-using-nice-cpulimit-and-cgroups
fonte
cpu.cfs_quota_us
de parâmetros (ver o manual )sudo cgclassify -g cpu:cpulimited 2315444
Você olhou para os cgroups? Há alguma informação no Arch Wiki sobre eles. Leia a seção sobre
cpu.shares
, parece que está fazendo o que você precisa, e eles podem operar no nível do usuário, para que você possa limitar todos os processos do usuário de uma só vez.fonte
Para memória, o que você está procurando é
ulimit -v
. Observe queulimit
é herdado por processos filho; portanto, se você o aplicar ao shell de login do usuário no momento do login, ele se aplicará a todos os seus processos.Se todos os usuários usarem
bash
como shell de logon, colocar a linha a seguir/etc/profile
deve fazer com que todos os processos do usuário tenham um limite rígido de 1 gigabyte (mais exatamente, um milhão de kilobytes):A opção
H
garante um limite rígido, ou seja, o usuário não pode configurá-lo novamente depois. Obviamente, o usuário ainda pode preencher memória iniciando processos suficientes ao mesmo tempo.Para outros shells, você precisará descobrir quais arquivos de inicialização eles lêem (e qual outro comando, em vez de
ulimit
usar).Para CPU, o que você deseja não parece fazer sentido para mim. Qual seria a utilidade de deixar 90% da CPU não ser utilizada quando apenas um processo estiver em execução? Eu acho que o que você realmente quer é
nice
(e possivelmenteionice
). Observe que, assimulimit
, osnice
valores são herdados pelos processos filhos, portanto, aplicá-lo ao shell de login no momento do login é suficiente. Eu acho que isso também se aplica,ionice
mas não tenho certeza.fonte
nice
isso será bom o suficiente para fazer isso? Se sim, você acha que pode me mostrar um exemplo para conseguir isso?Como você está afirmando que o cpulimit não seria prático no seu caso, sugiro que você analise nice , renice e tasket , que podem se aproximar do que você deseja alcançar, embora o tasket permita definir a afinidade da CPU de um processo, por isso pode não ser útil imediatamente no seu caso.
fonte
nice
erenice
? Isso é bom! Examinei as páginas de manual, mas ainda não acho que elas possam ajudar com isso, pois você ainda precisa definir um ID do processo. Se você pudesse, no entanto, me dar um exemplo que envolva esses pacotes para aplicar o limite em todos os processos em execução / processos futuros que seriam incríveis!Como suas tags possuem
centos
, você pode usarsystemd
.Por exemplo, se você deseja limitar o usuário com o ID de
1234
:sudo systemctl edit --force user-1234.slice
Em seguida, digite e salve este:
[Slice] CPUQuota=10%
Na próxima vez em que o usuário fizer login, isso afetará.
Páginas man:
systemctl
,systemd.slice
,systemd.resource-control
...fonte
Se você deseja limitar os processos que já foram iniciados, precisará fazê-lo um a um pelo PID, mas pode ter um script em lote para fazer isso como o abaixo:
No meu caso
pypdfocr
lança o gananciosotesseract
.Além disso, em alguns casos, sua CPU é muito boa e você pode usar um exemplo
renice
como este:fonte