Limitação de processos para não exceder mais de 10% do uso da CPU

31

Eu opero um sistema Linux que tem muitos usuários, mas às vezes ocorre um abuso; onde um usuário pode executar um único processo que usa mais de 80% da CPU / Memória.

Portanto, há uma maneira de evitar que isso aconteça limitando a quantidade de uso da CPU que um processo pode usar (para 10%, por exemplo)? Estou ciente de cpulimit , mas infelizmente aplica o limite aos processos que eu o instruo a limitar (por exemplo, processos únicos). Então, minha pergunta é: como posso aplicar o limite a todos os processos e processos em execução que serão executados no futuro sem a necessidade de fornecer seu ID / caminho, por exemplo?

    
por Giovanni Mounir 24.08.2014 / 11:16

7 respostas

19

Embora possa ser um abuso de memória, não é para CPU: quando uma CPU está inativa, um processo em execução (por "execução", quero dizer que o processo não está esperando por E / S ou outra coisa ) terá 100% de tempo de CPU por padrão. E não há razão para impor um limite.

Agora, você pode configurar prioridades graças a nice . Se você quiser que eles se apliquem a todos os processos para um determinado usuário, você só precisa garantir que o shell de login dele seja executado com nice : os processos filhos herdarão o valor nice . Isso depende de como os usuários fazem login. Consulte Priorizar logins ssh (nice) , 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 é definir /etc/security/limits.conf limites; veja a página man limits.conf (5). Por exemplo, você pode definir o tempo máximo de CPU por login e / ou o número máximo de processos por login. Você também pode definir maxlogins para 1 para cada usuário.

    
por 24.08.2014 / 13:40
24

bom / renice

nice é uma ótima ferramenta para ajustes "únicos" em um sistema.

 nice COMMAND

cpulimit

cpulimit se você precisar executar um trabalho intensivo de CPU e ter tempo livre de CPU é essencial para a capacidade de resposta de um sistema.

cpulimit -l 50 COMMAND

cgroups

cgroups aplica limites a um conjunto de processos, em vez de apenas um

cgcreate -g cpu:/cpulimited
cgset -r cpu.shares=512 cpulimited
cgexec -g cpu:cpulimited COMMAND_1
cgexec -g cpu:cpulimited COMMAND_2
cgexec -g cpu:cpulimited COMMAND_3

Recursos

link

    
por 02.04.2015 / 12:16
10

Você viu os cgroups? Há algumas informações no Arch Wiki sobre elas. Leia a seção sobre cpu.shares , parece que está fazendo o que você precisa e eles podem operar em um nível de usuário, para que você possa limitar todos os processos do usuário de uma só vez.

    
por 24.08.2014 / 12:41
3

Para memória, o que você está procurando é ulimit -v . Observe que ulimit é herdado por processos filhos, portanto, se você aplicá-lo ao shell de login do usuário no momento do login, ele se aplicará a todos os processos dele.

Se todos os usuários usarem bash como shell de login, colocar a seguinte linha em /etc/profile fará com que todos os processos do usuário tenham um limite máximo de 1 gigabyte (mais exatamente, um milhão de kilobytes):

ulimit -vH 1000000

A opção H garante que é um limite difícil, ou seja, o usuário não pode configurá-lo novamente depois. É claro que o usuário ainda pode preencher a memória iniciando vários processos de uma só vez.

Para outros shells, você terá que descobrir quais arquivos de inicialização eles lêem (e que outro comando em vez de ulimit eles usam).

Para CPU, o que você deseja não parece fazer sentido para mim. Qual seria o uso de deixar 90% da CPU sem uso quando apenas um processo está sendo executado? Eu acho que o que você realmente quer é nice (e possivelmente ionice ). Observe que, como ulimit , nice valores são herdados por processos filhos, portanto, aplicá-lo ao shell de login no momento do login é suficiente. Eu acho que isso também se aplica a ionice , mas não tenho certeza.

    
por 24.08.2014 / 11:59
3

Desde que você está afirmando que o cpulimit não seria prático no seu caso, então sugiro que você olhe para bom , renice e taskset , que pode se aproximar do que você deseja alcançar, embora o taskset permita definir a afinidade da CPU de um processo, portanto, pode não ser imediatamente útil no seu caso. / p>     

por 24.08.2014 / 11:49
1

Como suas tags têm centos , você pode usar systemd .

Por exemplo, se você quiser limitar o usuário com o ID de 1234 :

sudo systemctl edit --force user-1234.slice

Em seguida, digite e salve isto:

[Slice] CPUQuota=10%

Na próxima vez em que o usuário fizer login, isso afetará.

Páginas de manual: systemctl , systemd.slice , systemd.resource-control ...

    
por 19.01.2018 / 09:00
0

Se você quiser limitar os processos que já foram iniciados, você terá que fazer um por um pelo PID, mas você pode ter um script em lote para fazer isso como o abaixo:

#!/bin/bash
LIMIT_PIDS=$(pgrep tesseract)   # PIDs in queue replace tesseract with your name
echo $LIMIT_PIDS
for i in $LIMIT_PIDS
do
    cpulimit -p $i -l 10 -z &   # to 10 percent processes
done

No meu caso pypdfocr lança o ganancioso tesseract .

Além disso, em alguns casos, sua CPU é muito boa. Basta usar um renice assim:

watch -n5 'pidof tesseract | xargs -L1 sudo renice +19'
    
por 28.12.2017 / 20:51