cpulimit su uno script bash che esegue altri comandi
Su Febbraio 10, 2021 da adminHo uno script bash che esegue altri comandi ad alta intensità di CPU.
Quando applico cpulimit
sullo script bash, loutput di top
mostra i processi per i comandi allinterno dello script ancora eseguiti senza limitazioni da cpulimit
. Mi chiedo come posso limitare lutilizzo da parte della CPU dei comandi allinterno dello script bash?
Risposta
Secondo cpulimit --help
:
-i, --include-children limit also the children processes
Non ho verificato se questo si applica ai figli di bambini, né ho esaminato come viene implementato.
In alternativa, potresti usare cgroups
, che è una caratteristica del kernel.
I cgroup non forniscono nativamente un mezzo per limitare anche i processi figli, ma puoi usare il demone del motore delle regole cg (cgred) fornito di libcgroup; i comandi cgexec
e cgclassify
forniti dal pacchetto libcgroup forniscono un --sticky
flag per fare in modo che le regole si applichino anche ai processi figli.
Tieni presente che è coinvolta una condizione di competizione che potrebbe (almeno in teoria) comportare che alcuni processi figli non vengano limitati correttamente . Tuttavia, poiché attualmente stai utilizzando cpulimit
che viene eseguito comunque nello spazio utente, già non hai un limite di CPU affidabile al 100% tazioni quindi questa condizione di gara non dovrebbe essere un problema per te.
Ho scritto piuttosto ampiamente sul demone del motore delle regole cg nella mia risposta personale qui:
Risposta
Probabilmente non puoi “t.
cpulimit
” La logica è piuttosto semplice, richiede pid di processo e semplicemente invio il suo segnale kill -STOP $PID
, successivamente kill -CONT $PID
, e ancora, e ancora, e ancora, e ancora …
E misurare lutilizzo della CPU per calcolare il ritardo tra STOP e CONT.
Nel tuo caso, pstree
di script bash complessi richiederebbe N * x schermi di console.
Posso suggerirti un altro metodo per eseguire il downgrade dellutilizzo della CPU da qualsiasi script bash o anche eseguibile binario.
1) nice
– il processo di acquisizione e aumento o diminuzione della priorità da -20 (priorità più alta) a 20 (priorità più bassa). Probabilmente con un diapason troppo basso, ecco perché appaiono altre due utilità e hook del kernel:
2) ionice
– potrebbe essere la seconda generazione di nice
. È possibile separare i processi in base alla priorità da 0 (priorità più bassa) a 7 (priorità più alta). Inoltre, puoi separare i processi per classi, in tempo reale (massimo), best-efforts
(medio), inattivo (minimo) e Nessuno (predefinito).
3) chrt
– la cosa più importante che abbia mai incontrato, è simile a cpulimit
per la sua potenza e dominio sul processo. Anche qui potresti incontrare classi di priorità, idle
, real-time
, fifo
, batch
, ecc … E diapason di priorità molto grandi, da 1 a 99.
Ad esempio, potresti avviare un processo enorme con chrt -r -p 99 process
– e consumerà tutte le tue risorse.
Allo stesso modo, qualsiasi demone di grandi dimensioni potrebbe funzionare in “background” con chrt -r -p 0 process
– aspetterà tutti gli altri mentre le risorse di un sistema sono occupate.
Ad ogni modo, ti consiglio vivamente di leggere man chrt
e man ionice
prima di iniziare.
Ad esempio, “sto utilizzando rtorrent
per p2p. È un compito con la priorità più bassa per il mio sistema, quindi lo avvio in questo modo:
nice -n 20 chrt -i 0 ionice -c3 /usr/bin/rtorrent
Oppure puoi prendere gli hook & haks way. E scrivi il tuo script cpulimit_wrapper. Ad esempio:
# cat bash_script.sh #!/bin/bash while sleep 0; do find / dd if=/dev/random of=/tmp/random.bin bs=1M count=1000 done
plus
# 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
Risposta
Ora il modo migliore per me era eseguire uno script che consente a cpulimit controlla i processi in background da Askubuntu :
#!/bin/bash #The first variable is to set the number of cores in your processor. The reason that the number of cores is important is that you need to take it into consideration when setting cpulimit"s -l option. This is explained on the cpulimit project page (see http://cpulimit.sourceforge.net/): "If your machine has one processor you can limit the percentage from 0% to 100%, which means that if you set for example 50%, your process cannot use more than 500 ms of cpu time for each second. But if your machine has four processors, percentage may vary from 0% to 400%, so setting the limit to 200% means to use no more than half of the available power." NUM_CPU_CORES=$(nproc --all) #Automatically detects your system"s number of CPU cores. cpulimit -e "ffmpeg" -l $((50 * $NUM_CPU_CORES))& #Limit "ffmpeg" process to 50% CPU usage. cpulimit -e "zero-k" -l $((50 * $NUM_CPU_CORES))& #Limit "zero-k" process to 50% CPU usage. cpulimit -e "mlnet" -l $((50 * $NUM_CPU_CORES))& #Limit "mlnet" process to 50% CPU usage. cpulimit -e "transmission-gtk" -l $((50 * $NUM_CPU_CORES))& #Limit "transmission-gtk" process to 50% CPU usage. cpulimit -e "chrome" -l $((40 * $NUM_CPU_CORES))& #Limit "chrome" process to 40% CPU usage.
Modifica a quali processi sono utilizzato nello script e lasciarlo funzionare. cpulimit verrà eseguito in background e controllerà i processi richiesti e ne limiterà lutilizzo. Se uno qualsiasi dei processi è terminato, cpulimit rimarrà e limitare i processi se tornassero di nuovo in vita.
(Ho riscontrato uno strano problema se ho provato a eseguire ffmpeg tramite un ciclo for nel terminale. Questo paradossalmente ha generato due istanze di ffmpeg che hanno reso cpulimit “quasi u seless. Non sono riuscito a “trovare una risposta a quale sia il problema. Quindi, anche se” è “solo un ciclo for”, potresti dover scrivere uno script per Questo.)
Risposta
Utilizza il parametro -P
e inserisci il percorso assoluto prima del eseguibile.
Risposta
Ho provato a impostare lalias per cpulimit -l 50 ffmpeg
in .bashrc
alias ffmpegl = "cpulimit -l 50 ffmpeg"
e poi lho usato nel mio script con il seguente codice per gli alias di origine
shopt -s expand_aliases source /home/your_user/.bashrc
Ora posso usare cpulimit con ffmpeg ovunque allinterno dello script per più comandi usando lalias. Testato su linux scientifico 6.5.Funziona perfettamente.
Commenti
- sfortunatamente, il comando cpulimit passa poi in background, rendendo impossibile lo scripting iterativo
- Ho riscontrato anche questo; come soluzione alternativa se le iterazioni non sono molto complesse, utilizzando una combinazione di ‘ find ‘ reindirizzata a ‘ xargs ‘ ha fatto il lavoro per me.
Lascia un commento