cpulimit pe un script bash care rulează alte comenzi
On februarie 10, 2021 by adminAm un script bash care rulează alte comenzi cu intensitate cpu.
Când aplic cpulimit
pe scriptul bash, ieșirea din top
arată procesele pentru comenzile din script încă rulate fără limitare de cpulimit
. Mă întreb cum pot limita utilizarea cpu a comenzilor din scriptul bash?
Răspuns
Conform cpulimit --help
:
-i, --include-children limit also the children processes
Nu am testat dacă acest lucru se aplică copiilor copiilor și nici nu am analizat cum este implementat acest lucru.
Alternativ, puteți utiliza cgroups
, care este o caracteristică a nucleului.
Cgroup-urile nu oferă în mod nativ un mijloc de a limita și procesele copil, dar puteți utiliza demonul motorului de reguli cg (cgred) furnizat de către libcgroup; comenzile cgexec
și cgclassify
care provin din pachetul libcgroup oferă un --sticky
semnalizați pentru ca regulile să se aplice și proceselor copil.
Rețineți că există o condiție de rasă implicată, care ar putea (cel puțin teoretic) să ducă la restricționarea corectă a unor procese copil Cu toate acestea, întrucât utilizați în prezent cpulimit
care rulează oricum în spațiul utilizatorilor, deja nu aveți limită de procesare 100% fiabilă astfel încât această condiție a cursei să nu fie o problemă pentru dvs.
Am scris destul de mult despre demonul motorului regulilor cg în răspunsul meu de aici:
Răspuns
Probabil că poți „t.
cpulimit
” logica este destul de simplă, necesită proces de procesare și pur și simplu trimite semnalul său kill -STOP $PID
, după aceea kill -CONT $PID
, și din nou, și din nou, și din nou, și din nou ……
Și măsurarea utilizării CPU pentru a calcula întârzierea între STOP și CONT.
În cazul dvs., pstree
al scriptului bash complex ar lua N * x ecranele consolei.
Vă pot sugera o altă metodă de degradare a utilizării CPU a oricărui script bash sau chiar executabil binar.
1) nice
– procesul de preluare și creșterea sau scăderea priorității de la -20 (cea mai mare prioritate) la 20 (cea mai mică prioritate). Probabil că în diapason prea scăzut, de aceea, apar alte două cârlige util și kernel:
2) ionice
– poate fi a doua generație de nice
. Puteți separa procesele în funcție de prioritate de la 0 (cea mai mică prioritate) la 7 (cea mai mare prioritate). În plus, puteți separa procesele în funcție de clase, în timp real (cel mai înalt), best-efforts
(mijloc), inactiv (cel mai mic) și nici unul (implicit).
3) chrt
– cel mai înalt lucru pe care l-am întâlnit vreodată, este similar cu cpulimit
prin puterea sa și stăpânire pe proces. Aici puteți întâlni și clase de prioritate, idle
, real-time
, fifo
, batch
, etc … Și diapason de priorități foarte mari, de la 1 la 99.
De exemplu, puteți lansa un proces imens cu chrt -r -p 99 process
– și vă va consuma toate resursele.
În același mod, orice demon imens ar putea funcționa ușor în „fundal” cu chrt -r -p 0 process
– va aștepta pe toți ceilalți în timp ce resursele unui sistem sunt ocupate.
Oricum, vă recomand să citiți man chrt
și man ionice
înainte de a începe.
De exemplu, „folosesc rtorrent
pentru p2p. Este o sarcină cu cea mai mică prioritate pentru sistemul meu, apoi o lansez în așa fel:
nice -n 20 chrt -i 0 ionice -c3 /usr/bin/rtorrent
Sau, puteți lua cârligele & haks way. Și scrieți propriul script cpulimit_wrapper. De exemplu:
# 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
Răspuns
Acum cel mai bun mod pentru mine a fost să rulez un script care permite cpulimit procese de control în fundal din 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.
Editați la ce procese sunt utilizat în scriptul dvs. și lăsați-l să ruleze. cpulimit va rula în fundal și va urmări procesele solicitate și limitează utilizarea acestuia. Dacă vreunul dintre procese este terminat, cpulimit va rămâne și limitează procesele dacă vor reveni vreodată.
(Am întâmpinat o problemă ciudată când am încercat să rulez ffmpeg printr-o buclă for-terminal în terminal. Acest lucru a generat paradoxal două instanțe ffmpeg care au făcut ca cpulimit să fie aproape u seless. Nu am putut găsi un răspuns la care este problema. Deci, chiar dacă este „doar o buclă for”, poate fi necesar să scrieți un script pentru acest.)
Răspuns
Utilizați parametrul -P
și plasați calea absolută înaintea executabil.
Răspuns
Am încercat să configurez alias pentru cpulimit -l 50 ffmpeg
în .bashrc
alias ffmpegl = "cpulimit -l 50 ffmpeg"
și apoi l-am folosit în scriptul meu cu următorul cod pentru aliasuri sursă
shopt -s expand_aliases source /home/your_user/.bashrc
Acum pot folosi cpulimit cu ffmpeg oriunde în interiorul scriptului pentru mai multe comenzi folosind aliasul. Testat pe științific Linux 6.5.Funcționează perfect.
Comentarii
- din păcate, comanda cpulimit intră apoi în fundal, făcând imposibilă scriptarea iterativă
- Am întâlnit și asta; ca soluție, dacă iterațiile nu sunt foarte complexe, folosind o combinație de ‘ găsiți ‘ canalizat la ‘ xargs ‘ a făcut treaba pentru mine.
Lasă un răspuns