Como limitar o consumo de CPU de um grupo de processos com ferramentas padrão GNU/Linux?

Como limitar o consumo de CPU de um grupo de processos com ferramentas padrão GNU/Linux?

Tenho vários processos com o mesmo nome - eles ocupam 100% do tempo da minha CPU, quero que não passe de 50%.

Como posso fazer isso sem instalar nenhum software extra?

Responder1

Para um mecanismo em nível de kernel para isso, você precisa ler sobre LinuxGrupos de controle. Esta é uma área ainda em desenvolvimento ativo, então você precisará garantir que o que você lê é consistente com o kernel que você possui (ou deseja instalar).

Embora você tenha dito para não instalar nada adicional, você pode considerar a instalação cgredpara automatizar a movimentação de processos com nomes correspondentes ao seu cgroup de CPU. No Debian, isso está no cgroup-binpacote.

Responder2

Você pode fazer isso com comandos bash shell, sleep, pgrep e pkill usando sinais STOP e CONT.

O one-liner a seguir fará com que os processos usem no máximo 50% do tempo total de CPU disponível. Ele será executado a cada 100 milissegundos e depois será interrompido por mais 100 milissegundos.

while [ True ]; do pkill -STOP processname; sleep 0.1s; pkill -CONT processname; sleep 0.1s; done

Aqui está o mesmo código dividido em várias linhas para facilitar a leitura:

while [ True ]
     do pkill -STOP processname
     sleep 0.1s
     pkill -CONT processname
     sleep 0.1s
done

Não importa quantos processos existam seguindo o padrão processname, eles não podem ultrapassar 50% do uso da CPU, pois todos são parados e continuados ao mesmo tempo - o que significa que eles precisam compartilhar o tempo de CPU disponível entre eles, quando estão ativo. Isso garante que o limite seja atingido.

Existe um programa chamado cpulimit que faz aproximadamente a mesma coisa.

Responder3

Sem instalar nenhum software extra que você tenha nice. A faixa de valores é de-20para19.

nice -20 some_command

some_commandoPrioridade máxima, e

nice 19 some_command

some_commandoprioridade mais baixa.

Responder4

como escrito acima poderia ser usado como um script para ajudar o OOM-killer Ou também impedir seu uso

diga quando a CPU geral atinge 75% por x minutos, execute pkill.sh

 ../scripts/boottime/OOMkiller.sh

while [ true] ; 
    do  inxi -tcm5 > ~/cpu.log 
    sleep 0.5s 
    inxi -tcm5 >> ~/cpu/log | diff -m > ~/offender.log
done

for i in offender.log ;
    do ./scripts/pkill.sh
done

 ../scripts/pkill.sh
while [true] 
    do pgrep $(i) -STOP $PID
    pkill -STOP $PID
    sleep 0.5s 
    pkill -CONT $PID
done

informação relacionada