cpulimit na bash skriptu, který spouští další příkazy
On 10 února, 2021 by adminMám bash skript, který spouští další příkazy náročné na CPU.
Když použiji cpulimit
v bash skriptu výstup top
zobrazuje procesy pro příkazy uvnitř skriptu, které stále běží bez omezení cpulimit
. Zajímalo by mě, jak mohu omezit využití CPU příkazů uvnitř bash skriptu?
Odpověď
Podle cpulimit --help
:
-i, --include-children limit also the children processes
Netestoval jsem, zda se to týká dětí dětí, ani jsem nezkoumal, jak je implementováno.
Alternativně můžete použít cgroups
, což je funkce jádra.
Cgroups také přirozeně neposkytují prostředky k omezení podřízených procesů, ale můžete použít démona cg rules engine (cgred) podle libcgroup; příkazy cgexec
a cgclassify
pocházející z balíčku libcgroup poskytují --sticky
příznak, aby se pravidla vztahovala i na podřízené procesy.
Uvědomte si, že se jedná o spor, který může (alespoň teoreticky) vést k tomu, že některé podřízené procesy nebudou správně omezeny Protože však v současné době používáte cpulimit
, který běží v uživatelském prostoru, již nemáte 100% spolehlivé omezení CPU Tato rasová podmínka by pro vás neměla být přerušovačem obchodu.
O démonovi motoru cg pravidel jsem ve své vlastní odpovědi zde psal poměrně rozsáhle:
odpověď
Pravděpodobně můžete „t.
cpulimit
“ logika je velmi jednoduchá, vyžaduje proces a jednoduché odesílání jeho signál kill -STOP $PID
, poté kill -CONT $PID
a znovu a znovu a znovu a znovu a znovu ……
A měření využití procesoru pro výpočet zpoždění mezi STOP a CONT.
Ve vašem případě by pstree
komplexního bash-skriptu trvalo N * x obrazovky konzoly.
Mohu vám navrhnout jinou metodu, jak downgradovat použití CPU libovolného bash skriptu nebo dokonce binárního spustitelného souboru.
1) nice
– jeho proces přijímání a zvyšování nebo snižování jeho priority z -20 (nejvyšší priorita) na 20 (nejnižší priorita). Pravděpodobně v příliš nízkém diapasonu, proto se objevují další dva nástroje a háčky jádra:
2) ionice
– může to být druhá generace nice
. Procesy můžete rozdělit podle priority od 0 (nejnižší priorita) do 7 (nejvyšší priorita). Navíc můžete procesy oddělit podle tříd, v reálném čase (nejvyšší), best-efforts
(uprostřed), nečinnosti (nejnižší) a žádného (výchozí).
3) chrt
– nejvyšší věc, kterou jsem kdy potkal, je to podobné jako cpulimit
svou silou a nadvláda nad procesem. I zde byste se mohli setkat s prioritními třídami idle
, real-time
, fifo
, batch
atd … A diapason priorit velmi velkých, od 1 do 99.
Například můžete spustit jeden obrovský proces s chrt -r -p 99 process
– a pohltí všechny vaše zdroje.
Stejným způsobem může jakýkoli obrovský démon fungovat „na pozadí“ s chrt -r -p 0 process
– bude čekat na všechny ostatní, dokud budou prostředky systému zaneprázdněny.
Každopádně vám velmi doporučuji přečíst man chrt
a man ionice
, než začnete.
Například používám rtorrent
pro p2p. Je to úkol s nejnižší prioritou pro můj systém, potom jej spouštím takto:
nice -n 20 chrt -i 0 ionice -c3 /usr/bin/rtorrent
Nebo můžete použít háčky & haks way. A napište svůj vlastní skript cpulimit_wrapper. Například:
# 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
Odpověď
Nejlepším způsobem pro mě teď bylo spuštění skriptu, který umožňuje cpulimit kontrolní procesy na pozadí od 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.
Upravit, jaké procesy jsou použitý ve vašem skriptu a nechte jej běžet. cpulimit poběží na pozadí a bude sledovat požadované procesy a omezuje jeho použití. Pokud je některý z procesů dokončen, cpulimit zůstane a omezit procesy, pokud někdy znovu ožijí.
(Setkal jsem se s podivným problémem, když jsem se pokusil spustit ffmpeg přes for-loop v terminálu. To paradoxně vytvořilo dvě instance ffmpeg, díky nimž byl cpulimit téměř seless. Nemohl jsem najít odpověď na to, v čem je problém. Takže i když se jedná pouze o smyčku, možná budete muset napsat skript pro tento.)
Odpověď
Použijte parametr -P
a umístěte absolutní cestu před spustitelný.
Odpověď
Zkoušel jsem nastavit alias pro cpulimit -l 50 ffmpeg
v .bashrc
alias ffmpegl = "cpulimit -l 50 ffmpeg"
a poté jej použil ve svém skriptu s následujícím kódem ke zdrojovým aliasům
shopt -s expand_aliases source /home/your_user/.bashrc
Nyní mohu použít cpulimit s ffmpeg kdekoli uvnitř skriptu pro více příkazů pomocí alias. Testováno na vědeckém systému Linux 6.5. Funguje perfektně.
Komentáře
- bohužel příkaz cpulimit poté přejde na pozadí, což znemožňuje iterativní skriptování
- Také jsem se s tím setkal; jako řešení, pokud iterace nejsou příliš složité, pomocí kombinace ‚ find ‚ piped to ‚ xargs ‚ odvedl práci za mě.
Napsat komentář