cpulimit bash-komentosarjassa, joka suorittaa muita komentoja
On helmikuu 10, 2021 by adminMinulla on bash-komentosarja, joka suorittaa muita suorittimia vaativia komentoja.
Kun haen cpulimit
bash-komentosarjassa, top
-lähtö näyttää komentosarjan sisällä olevien komentojen prosessit, joita ajaa edelleen rajoituksetta cpulimit
. Ihmettelen, kuinka voin rajoittaa komentojen suorittimen käyttöä bash-komentosarjassa?
vastaus
cpulimit --help
mukaan:
-i, --include-children limit also the children processes
En ole testannut, koskeeko tämä lasten lapsia, enkä selvittänyt, miten tämä toteutetaan.
Vaihtoehtoisesti voit käyttää cgroups
, joka on ytimen ominaisuus.
Ryhmät eivät luonnollisesti tarjoa keinoja rajoittaa myös aliprosesseja, mutta voit käyttää annettuja cg-sääntöjen moottoridemonia (cgred). libcgroup; libcgroup-paketista tulevat cgexec
– ja cgclassify
-komennot tarjoavat --sticky
lippu, jotta säännöt koskevat myös lapsen prosesseja.
Ota huomioon, että kyseessä on rodutila, joka voi (ainakin teoriassa) johtaa siihen, että joitain lapsen prosesseja ei rajoiteta oikein . Mutta kun käytät tällä hetkellä cpulimit
, joka toimii joka tapauksessa käyttäjätilassa, sinulla jo ei ole 100% luotettavia suorittimen rajoituksia joten tämän kilpailutilanteen ei pitäisi olla sinulle sopimussuhde.
Kirjoitin varsin laajasti cg-sääntöjen moottoridemonista tässä omassa vastauksessani:
vastaus
Luultavasti voit ”t”.
cpulimit
”logiikka on melko yksinkertainen, se vie prosessia ja lähettää vain sen signaali kill -STOP $PID
, sen jälkeen kill -CONT $PID
, ja uudestaan, uudestaan, uudestaan ja uudestaan ……
Ja suorittimen käytön mittaaminen STOP: n ja CONT: n välisen viiveen laskemiseksi.
Sinun tapauksessasi monimutkaisen bash-komentosarjan pstree
vie N * x konsolin näytöt.
Voin ehdottaa sinulle toista menetelmää minkä tahansa bash-komentosarjan tai jopa binaarisen suoritettavan prosessorin käytön päivittämiseksi.
1) nice
– sen ottamisprosessi ja prioriteetin nostaminen tai vähentäminen arvosta -20 (korkein prioriteetti) arvoon 20 (matalin prioriteetti). Todennäköisesti liian matalassa diapasonissa, siksi on olemassa kaksi muuta apuohjelmaa ja ytimen koukkua:
2) ionice
– ehkä se on nice
. Voit erottaa prosessit prioriteetin mukaan 0: sta (matalin prioriteetti) 7: een (korkein prioriteetti). Lisäksi voit erottaa prosessit luokkien, reaaliaikaisen (korkein), best-efforts
(keskimmäinen), tyhjäkäynnin (matalin) ja ei mitään (oletus) -kohtien mukaan.
3) chrt
– korkein mitä olen koskaan tavannut, se on samanlainen kuin voimallaan cpulimit
valta prosessissa. Täällä voit tavata myös prioriteettiluokit idle
, real-time
, fifo
, batch
jne. … Ja prioriteetit ovat erittäin suuret, 1: stä 99: een.
Voit esimerkiksi käynnistää yhden suuren prosessin – ja se syö kaikki resurssisi.
Samalla tavoin mikä tahansa valtava daemon voisi pehmentää ”taustalla” toimimista chrt -r -p 0 process
– se odottaa kaikkia muita, kun järjestelmän resurssit ovat varattuja.
Ehdotan joka tapauksessa, että luet man chrt
ja man ionice
ennen aloittamista.
Esimerkiksi, ”minä käytän p2p: lle rtorrent
. Se on järjestelmääni matalin prioriteetti, joten käynnistän sen tällä tavalla:
nice -n 20 chrt -i 0 ionice -c3 /usr/bin/rtorrent
Tai voit ottaa koukut & haks way. Ja kirjoita oma cpulimit_wrapper-komentosarja. Esimerkki:
# 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
vastaus
Nyt minulle paras tapa oli suorittaa komentosarja, jonka avulla cpulimit Ohjausprosessit taustalla Askubuntulta :
#!/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.
Muokkaa prosesseihin käyttää komentosarjassa ja anna sen suorittaa. cpulimit toimii taustalla ja seuraa kysyttyjä prosesseja ja rajoittaa sen käyttöä. Jos jokin prosesseista on valmis, cpulimit pysyy silti rajoita prosesseja, jos ne koskaan heräävät eloon.
(Minulla oli outo ongelma, jos yritin suorittaa ffmpeg for-loopin kautta terminaalissa. Tämä synnytti paradoksaalisesti kaksi ffmpeg-instanssia, jotka tekivät cpulimitin ”melkein u seless. En löytänyt vastausta ongelman ongelmaan. Joten vaikka se olisi ”vain silmukka”, sinun on ehkä kirjoitettava komentosarja Tämä.)
Vastaus
Käytä parametria -P
ja aseta absoluuttinen polku suoritettava.
Vastaus
Yritin määrittää aliaksen cpulimit -l 50 ffmpeg
-kentälle .bashrc
alias ffmpegl = "cpulimit -l 50 ffmpeg"
ja käytti sitä sitten komentosarjassa seuraavan koodin kanssa aliasten lähteenä
shopt -s expand_aliases source /home/your_user/.bashrc
Nyt voin käyttää cpulimit-tiedostoa ffmpeg: n kanssa missä tahansa komentosarjan sisällä useita komentoja varten aliaksen avulla. Testattu tieteellisellä linuxilla 6.5. Toimii täydellisesti.
Kommentit
- valitettavasti cpulimit-komento siirtyy sitten taustalle, mikä tekee iteratiivisen komentosarjan käytöstä maata
- Tapasin myös tämän; kiertotapana, jos iteraatiot eivät ole kovin monimutkaisia, käyttämällä yhdistelmää ’ find ’ yhdistetään ’ xargs ’ teki työn puolestani.
Vastaa