cpulimit på ett bash-skript som kör andra kommandon
On februari 10, 2021 by adminJag har ett bash-skript som kör andra cpu-intensiva kommandon.
När jag tillämpar cpulimit
i bash-skriptet visar utdata från top
processer för kommandona inuti skriptet som fortfarande körs utan begränsning av cpulimit
. Jag undrar hur jag kan begränsa cpu-användningen av kommandona i bash-skriptet?
Svar
Enligt cpulimit --help
:
-i, --include-children limit also the children processes
Jag har inte testat om detta gäller barn till barn och inte heller undersökt hur detta implementeras.
Alternativt kan du använda cgroups
, vilket är en kärnfunktion.
Cgroups ger inte ett sätt att begränsa barnprocesser också, men du kan använda cg-regler motordemon (cgred) som tillhandahålls av libcgroup; kommandona och cgclassify
som kommer från libcgroup-paketet ger en --sticky
flagga för att även regler ska gälla för barnprocesser.
Var medveten om att det finns ett rasvillkor som kan (åtminstone teoretiskt) leda till att vissa barnprocesser inte begränsas korrekt Eftersom du för närvarande använder cpulimit
som ändå körs i användarutrymmet, har du redan inte 100% tillförlitlig CPU-gräns tationer så att detta tävlingsvillkor inte borde vara en deal-breaker för dig.
Jag skrev ganska omfattande om cg-regler-motordemonen i mitt självsvar här:
Svar
Förmodligen kan du ”t.
cpulimit
” s logik är ganska enkel, det tar lite tid av processen och helt enkelt att skicka dess signal kill -STOP $PID
, därefter kill -CONT $PID
, och igen, och igen, och igen, och igen ……
Och mätning av cpu-användning för att beräkna fördröjning mellan STOP och CONT.
I ditt fall tar pstree
av komplexa bash-script N * x skärmar av konsolen.
Jag kan föreslå dig en annan metod för att nedgradera CPU-användning av valfritt bash-skript eller till och med binär körbar.
1) nice
– det tar processen och ökar eller minskar sin prioritet från -20 (Högsta prioritet) till 20 (Lägsta prioritet). Förmodligen i för låg diapason, det är därför, det finns ytterligare två verktyg och kärnkrokar:
2) ionice
– kanske det är andra generationen av nice
. Du kan separera processer med prioritet från 0 (lägsta prioritet) till 7 (högsta prioritet). Dessutom kan du separera processer efter klasser, realtid (högst), best-efforts
(mitten), tomgång (lägst) och inget (standard).
3) chrt
– det högsta jag någonsin har träffat, det liknar cpulimit
med sin kraft och dominans på processen. Här kan du också möta prioritetsklasser, idle
, real-time
, fifo
, batch
, etc … Och diapason av prioriteringar mycket stora, från 1 till 99.
Du kan till exempel starta en enorm process med chrt -r -p 99 process
– och det äter alla dina resurser.
På samma sätt kan alla stora demoner fungera i ”bakgrund” med chrt -r -p 0 process
– det väntar på alla andra medan resurserna i ett system är upptagen.
Hur som helst föreslår jag att du läser man chrt
och man ionice
innan du börjar.
Till exempel använder jag rtorrent
för p2p. Det är minsta prioritetsuppgift för mitt system, då startar jag det på ett sådant sätt:
nice -n 20 chrt -i 0 ionice -c3 /usr/bin/rtorrent
Eller så kan du ta krokarna & haks sätt. Och skriv ditt eget cpulimit_wrapper-skript. Till exempel:
# 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
Svar
Det bästa sättet för mig var nu att köra ett skript som låter cpulimit kontrollprocesser i bakgrunden från 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.
Redigera till vilka processer som är används i ditt skript och låt det köras. cpulimit körs i bakgrunden och tittar på efterfrågade processer och begränsar dess användning. Om någon av processerna är klar cpulimit kommer fortfarande att stanna och begränsa processerna om de någonsin kommer till liv igen.
(Jag stötte på ett konstigt problem om jag försökte köra ffmpeg genom en for-loop i terminalen. Detta skapade paradoxalt två ffmpeg-instanser som gjorde cpulimit ”ing nästan u själv. Jag kunde inte hitta något svar på vad problemet är. Så även om det bara är en för-loop kan du behöva skriva ett manus för detta.)
Svar
Använd -P
-parametern och placera den absoluta sökvägen före körbar.
Svar
Jag försökte ställa in alias för cpulimit -l 50 ffmpeg
i .bashrc
alias ffmpegl = "cpulimit -l 50 ffmpeg"
och använde det sedan i mitt skript med följande kod för att källa alias
shopt -s expand_aliases source /home/your_user/.bashrc
Nu kan jag använda cpulimit med ffmpeg var som helst i skriptet för flera kommandon med aliaset. Testat på vetenskaplig linux 6.5. Fungerar perfekt.
Kommentarer
- Tyvärr går kommandot cpulimit sedan i bakgrunden, vilket gör iterativ skript omöjlig
- Jag stötte också på detta; som en lösning om iterationer inte är särskilt komplexa, med en kombination av ’ hitta ’ piped till ’ xargs ’ gjorde jobbet för mig.
Lämna ett svar