cpulimit em um script bash que executa outros comandos

3

Eu tenho um script bash que executa outros comandos intensivos da CPU.

Quando eu aplico cpulimit no script bash, a saída de top mostra que os processos para os comandos dentro do script ainda são executados sem limitação por cpulimit . Eu me pergunto como posso limitar o uso da CPU dos comandos dentro do script bash?

    
por Tim 06.03.2015 / 01:00

3 respostas

1

De acordo com cpulimit --help :

-i, --include-children limit also the children processes

Eu não testei se isso se aplica a filhos de crianças, nem analisei como isso é implementado.

Como alternativa, você pode usar o cgroups , que é um recurso do kernel.

Os cgroups também nativamente fornecem um meio de limitar os processos filhos, mas você pode usar o daemon do mecanismo de regras cg (cgred) fornecido pelo libcgroup; Os comandos cgexec e cgclassify que vêm do pacote libcgroup fornecem um sinal --sticky para fazer com que as regras se apliquem também aos processos filhos.

Esteja ciente de que há uma condição de corrida envolvida que poderia (pelo menos teoricamente) resultar em alguns processos filhos não sendo restritos corretamente. No entanto, como você está atualmente usando cpulimit que é executado no espaço do usuário de qualquer maneira, você não tem 100% de limitações de CPU confiáveis, portanto, essa condição de corrida não deve ser um problema para você.

Eu escrevi bastante sobre o daemon do mecanismo de regras cg em minha auto-resposta aqui:

por 28.11.2017 / 08:49
0

Provavelmente, você não pode.

A lógica de

cpulimit é bem simples, é preciso um pid de processo e simplesmente enviar seu sinal kill -STOP $PID , depois kill -CONT $PID , e de novo, de novo e de novo e de novo ......

E medindo o uso da cpu para calcular o atraso entre STOP e CONT.

No seu caso, pstree do complexo bash-script levaria N * x telas do console.

Posso sugerir outro método para fazer o downgrade do uso de cpu de qualquer script bash ou até executável binário.

1) nice - seu processo de tomada e aumentando ou diminuindo sua prioridade de -20 (Prioridade mais alta) para 20 (Prioridade mais baixa). Provavelmente em um diapasão muito baixo, é por isso que aparecem outros utils e ganchos de kernel:

2) ionice - pode ser a segunda geração de nice . Você pode separar processos por prioridade de 0 (prioridade mais baixa) a 7 (prioridade mais alta). Além disso, você poderia separar os processos por classes, em tempo real (maior), best-efforts (meio), ocioso (mais baixo) e nenhum (padrão).

3) chrt - a maior coisa que eu já conheci, é semelhante a cpulimit por seu poder e domínio no processo. Aqui você também pode encontrar classes de prioridade, idle , real-time , fifo , batch , etc ... E diapasão de prioridades muito grandes, de 1 a 99.

Por exemplo, você pode iniciar um processo enorme com chrt -r -p 99 process - e ele consumirá todos os seus recursos.

Da mesma forma, qualquer daemon enorme poderia funcionar suavemente em "background" com chrt -r -p 0 process - ele irá esperar por todos os outros enquanto os recursos de um sistema estiverem ocupados.

De qualquer forma, sugiro que você leia man chrt e man ionice antes de começar.

Por exemplo, estou usando rtorrent para p2p. É a tarefa de menor prioridade para o meu sistema, então eu estou lançando de tal forma:

nice -n 20 chrt -i 0 ionice -c3 /usr/bin/rtorrent

Ou, você pode pegar o jeito dos ganchos e dos haks. E escreva seu próprio script cpulimit_wrapper. Por exemplo:

# cat bash_script.sh 
#!/bin/bash


while sleep 0; do
        find /

        dd if=/dev/random of=/tmp/random.bin bs=1M count=1000
done

mais

# cat cpulimit.sh 
#!/bin/bash


TARGET=$1

[ -z "$TARGET" ] && echo "Usage bash cpulimit.sh command" && exit 1

cpulimit -l 1 bash $TARGET

while sleep 0;do
        lsof -n -t $TARGET | xargs pstree -p | sed -e 's/(/(\n/g' | sed -e 's/)/\n)/g' | egrep -v '\(|\)' | while read i; do 
                echo $i; 
                cpulimit -l 1 -b -p $i; 
        done
done
    
por 24.08.2015 / 13:02
-1

Eu tentei configurar alias para cpulimit -l 50 ffmpeg em .bashrc

alias ffmpegl = "cpulimit -l 50 ffmpeg"

e depois usei na minha script com o seguinte código para aliases de origem

shopt -s expand_aliases
source /home/your_user/.bashrc

Agora eu posso usar o cpulimit com ffmpeg em qualquer lugar dentro do script para vários comandos usando o alias. Testado em linux científico 6.5. Funciona perfeitamente.

    
por 29.06.2016 / 08:13