cpulimit op een bash-script dat andere commandos uitvoert
Geplaatst op februari 10, 2021 door adminIk heb een bash-script dat andere cpu-intensieve commandos uitvoert.
Wanneer ik solliciteer cpulimit
op het bash-script, de uitvoer van top
toont processen voor de opdrachten in het script die nog steeds zonder beperking worden uitgevoerd door cpulimit
. Ik vraag me af hoe ik het cpu-gebruik van de opdrachten in het bash-script kan beperken?
Antwoord
Volgens cpulimit --help
:
-i, --include-children limit also the children processes
Ik heb niet getest of dit van toepassing is op kinderen van kinderen, en ook niet hoe dit wordt geïmplementeerd.
Als alternatief zou je cgroups
, wat een kernelfunctie is.
Cgroups bieden niet “native” middelen om onderliggende processen te beperken, maar je kunt de cg rules engine daemon (cgred) gebruiken door libcgroup; de cgexec
en cgclassify
opdrachten die uit het libcgroup-pakket komen, bieden een --sticky
vlag om regels ook van toepassing te maken op onderliggende processen.
Houd er rekening mee dat er sprake is van een racevoorwaarde die zou kunnen (in ieder geval theoretisch) ertoe leiden dat sommige onderliggende processen niet correct worden beperkt . Aangezien u momenteel echter “cpulimit
gebruikt dat toch in de gebruikersruimte wordt uitgevoerd, heeft u al geen 100% betrouwbare CPU-limi zodat deze race-conditie geen deal-breaker voor je zou moeten zijn.
Ik heb nogal uitgebreid geschreven over de cg rules engine daemon in mijn zelfantwoord hier:
Antwoord
Waarschijnlijk kunt u “t.
cpulimit
” s logica is vrij eenvoudig, het vergt pid van proces en eenvoudig verzenden zijn signaal kill -STOP $PID
, daarna kill -CONT $PID
, en opnieuw, en opnieuw, en opnieuw, en opnieuw ……
En het meten van het cpu-gebruik om de vertraging tussen STOP en CONT te berekenen.
In jouw geval zou pstree
van een complex bash-script N * x nodig hebben schermen van console.
Ik kan je een andere methode voorstellen om het CPU-gebruik van elk bash-script of zelfs een binair uitvoerbaar bestand te downgraden.
1) nice
– het opnameproces en het verhogen of verlagen van de prioriteit van -20 (hoogste prioriteit) tot 20 (laagste prioriteit). Waarschijnlijk met een te lage diapason, daarom verschijnen er nog twee utils en kernel hooks:
2) ionice
– misschien is het de tweede generatie van nice
. U kunt processen op prioriteit scheiden van 0 (laagste prioriteit) tot 7 (hoogste prioriteit). Bovendien kunt u processen scheiden in klassen, real-time (hoogste), best-efforts
(midden), inactief (laagste) en geen (standaard).
3) chrt
– het hoogste dat ik ooit heb ontmoet, het is vergelijkbaar met cpulimit
door zijn kracht en heerschappij over proces. Hier kunt u ook prioriteitsklassen ontmoeten, idle
, real-time
, fifo
, batch
, enz … En overzicht van prioriteiten erg groot, van 1 tot 99.
Je zou bijvoorbeeld een enorm proces kunnen starten met chrt -r -p 99 process
– en het zal al je bronnen opeten.
Op dezelfde manier kan elke grote daemon soft werken op “achtergrond” met chrt -r -p 0 process
– het zal op iedereen wachten terwijl de bronnen van een systeem bezet zijn.
Hoe dan ook, ik raad je ten zeerste aan om man chrt
en man ionice
te lezen voordat je begint.
Ik gebruik bijvoorbeeld rtorrent
voor p2p. Het is de taak met de laagste prioriteit voor mijn systeem, dan start ik het op de volgende manier:
nice -n 20 chrt -i 0 ionice -c3 /usr/bin/rtorrent
Of je kunt de hooks nemen & haks manier. En schrijf je eigen cpulimit_wrapper-script. Bijvoorbeeld:
# 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
Antwoord
Nu was de beste manier voor mij om een script uit te voeren waarmee cpulimit beheer processen op de achtergrond van 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.
Bewerken naar welke processen zijn gebruikt in uw script en laat het draaien. cpulimit wordt op de achtergrond uitgevoerd en let op gevraagde processen en beperkt het gebruik ervan. Als een van de processen is voltooid, blijft cpulimit staan en beperk de processen als ze ooit weer tot leven komen.
(Ik kwam een vreemd probleem tegen toen ik probeerde ffmpeg door een for-loop in terminal te laten lopen. Dit leverde paradoxaal genoeg twee ffmpeg-instanties op waardoor cpulimit bijna u seless. Ik kon geen antwoord vinden op wat het probleem is. Dus zelfs als het “slechts een for-loop” is, moet u wellicht een script schrijven voor dit.)
Answer
Gebruik de parameter -P
en plaats het absolute pad voor de uitvoerbaar bestand.
Answer
Ik heb geprobeerd een alias in te stellen voor cpulimit -l 50 ffmpeg
in .bashrc
alias ffmpegl = "cpulimit -l 50 ffmpeg"
en gebruikte het vervolgens in mijn script met de volgende code om aliassen te genereren
shopt -s expand_aliases source /home/your_user/.bashrc
Nu kan ik cpulimit met ffmpeg overal in het script gebruiken voor meerdere opdrachten met de alias. Getest op wetenschappelijke linux 6.5. Werkt perfect.
Reacties
- helaas gaat het cpulimit commando naar de achtergrond, waardoor iteratief scripten onmogelijk wordt
- Ik ben dit ook tegengekomen; als tijdelijke oplossing als iteraties niet erg complex zijn, met een combinatie van ‘ zoek ‘ doorgesluisd naar ‘ xargs ‘ deed het werk voor mij.
Geef een reactie