cpulimit egy bash szkripten, amely más parancsokat futtat
On február 10, 2021 by adminVan egy bash szkriptem, amely más CPU-intenzív parancsokat futtat.
Amikor jelentkezem cpulimit
a bash szkripten, a top
kimenete megmutatja a parancsfájl belsejében lévő parancsok folyamatát, amelyeket a . Kíváncsi vagyok, hogyan korlátozhatom a bash szkript belsejében lévő parancsok CPU használatát?
Válasz
A cpulimit --help
szerint:
-i, --include-children limit also the children processes
Nem teszteltem, hogy ez vonatkozik-e a gyermekek gyermekeire, és azt sem vizsgáltam, hogy ez hogyan valósul meg.
Alternatív megoldásként használhatja a cgroups
, amely egy kernelfunkció.
A csoportok natív módon nem biztosítanak eszközt a gyermekfolyamatok korlátozására sem, de használhatja a cg szabályok motor démonját (cgred) a libcgroup által; a libcgroup csomagból származó cgexec
és cgclassify
parancsok --sticky
jelölje meg, hogy a szabályok a gyermekfolyamatokra is érvényesek legyenek.
Ne feledje, hogy van egy olyan faji körülmény, amely (legalábbis elméletileg) azt eredményezheti, hogy egyes gyermekfolyamatokat nem korlátoznak helyesen . Mivel azonban jelenleg a cpulimit
szolgáltatást használja, amely egyébként a felhasználói térben fut, akkor már nem rendelkezik 100% -osan megbízható CPU-korlátokkal Ez a versenyfeltétel nem lehet üzletkötő az Ön számára.
Elég sokat írtam a cg szabályok motor démonjáról az itteni saját válaszomban:
Válasz
Valószínűleg tud “t”.
cpulimit
“logikája meglehetősen egyszerű, folyamatot igényel és egyszerűen elküld jelét kill -STOP $PID
, ezt követően kill -CONT $PID
, és újra, és újra, és újra, és újra ……
És a CPU-használat mérése a STOP és a CONT közötti késés kiszámításához.
Az Ön esetében a pstree
összetett bash-script N * x képernyők konzol.
Javasolhatok még egy módszert bármely bash-szkript vagy akár bináris futtatható fájl CPU-használatának visszaminősítésére.
1) nice
– annak felvételi folyamata és prioritásának növelése vagy csökkentése -20-ról (Legmagasabb prioritás) 20-ra (Alacsonyabb prioritás). Valószínűleg túl alacsony átmérőjű, ezért megjelenik egy másik két segédprogram és kernelhorog:
2) ionice
– lehet, hogy ez a nice
. Elkülönítheti a folyamatokat prioritás szerint 0-tól (legalacsonyabb prioritás) 7-ig (legmagasabb prioritás). Ráadásul szétválaszthatja a folyamatokat osztályok, valós idejű (legmagasabb), best-efforts
(középső), tétlen (legalacsonyabb) és nincs (alapértelmezett) szerint.
3) chrt
– a legmagasabb dolog, amivel valaha találkoztam, erejével hasonlít a cpulimit
uralom a folyamaton. Itt találkozhat a idle
, real-time
, fifo
, batch
stb. … És a prioritások áttekintése nagyon nagy, 1-től 99-ig.
Például elindíthat egy hatalmas folyamatot a következővel: chrt -r -p 99 process
– és megeszi az összes erőforrást.
Ugyanígy bármelyik hatalmas démon képes a „háttérben” működni a chrt -r -p 0 process
segítségével – mindenki másra vár, amíg a rendszer erőforrásai foglaltak.
Mindenesetre azt javaslom, hogy olvassa el a következőt: man chrt
és man ionice
, mielőtt elkezdené.
Például a rtorrent
funkciót használom a p2p-hez. Ez a legalacsonyabb prioritású feladat a rendszerem számára, akkor ezt úgy indítom el:
nice -n 20 chrt -i 0 ionice -c3 /usr/bin/rtorrent
Vagy megteheti a horgokat & haks way. És írja meg saját cpulimit_wrapper szkriptjét. Például:
# cat bash_script.sh #!/bin/bash while sleep 0; do find / dd if=/dev/random of=/tmp/random.bin bs=1M count=1000 done
plusz
# 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
Válasz
Most a legjobb módszer volt egy olyan szkript futtatása, amely lehetővé teszi a cpulimit folyamatok vezérlése a háttérben a Askubuntu -ból:
#!/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.
Szerkessze, hogy milyen folyamatok vannak használja a szkriptben, és hagyja futni. A cpulimit a háttérben fut, figyeli a kért folyamatokat, és korlátozza annak használatát. Ha bármelyik folyamat befejeződött, a cpulimit továbbra is korlátozza a folyamatokat, ha valaha is életre kelnek.
(Furcsa problémával szembesültem, amikor az ffmpeg-et próbáltam futtatni egy for-cikluson keresztül a terminálon. Ez paradox módon két ffmpeg példányt hozott létre, amelyek a cpulimit-et szinte u-ra tették. önzetlen. Nem találtam választ arra, hogy mi a probléma. Tehát akkor is, ha “csak” for-loop “-ként ír egy szkriptet ez.)
Válasz
Használja a -P
paramétert, és az abszolút elérési utat a futtatható.
Válasz
Próbáltam álnevet beállítani a cpulimit -l 50 ffmpeg
fájlhoz a .bashrc
alias ffmpegl = "cpulimit -l 50 ffmpeg"
, majd a szkriptemben a következő kóddal használták álnevek forrását
shopt -s expand_aliases source /home/your_user/.bashrc
Mostantól a cpulimit-t az ffmpeg-kel együtt használhatom a parancsfájl belsejében, az alias használatával több parancshoz. Tesztelve a tudományos linux 6.5-en. Tökéletesen működik.
Megjegyzések
- sajnos a cpulimit parancs ezután háttérbe kerül, ezáltal az iteratív szkriptek készítése
- én is találkoztam ezzel; megoldásként, ha az iterációk nem túl bonyolultak, a ‘ find ‘ kombinációt használva a ‘ xargs ‘ elvégezte helyettem a munkát.
Vélemény, hozzászólás?