cpulimit w skrypcie basha, który uruchamia inne polecenia
On 10 lutego, 2021 by adminMam skrypt bash, który uruchamia inne polecenia intensywnie korzystające z procesora.
Kiedy stosuję cpulimit
w skrypcie bash, wynik top
pokazuje procesy poleceń wewnątrz skryptu, które nadal działają bez ograniczeń przez cpulimit
. Zastanawiam się, jak mogę ograniczyć użycie procesora przez polecenia wewnątrz skryptu bash?
Odpowiedź
Zgodnie z cpulimit --help
:
-i, --include-children limit also the children processes
Nie testowałem, czy dotyczy to dzieci dzieci, ani nie sprawdzałem, jak to jest zaimplementowane.
Alternatywnie możesz użyć cgroups
, który jest funkcją jądra.
Grupy C nie zapewniają również natywnie środków do ograniczania procesów potomnych, ale możesz użyć dostarczonego demona silnika reguł cg (cgred) przez libcgroup; polecenia cgexec
i cgclassify
pochodzące z pakietu libcgroup zapewniają --sticky
flaga, aby reguły miały zastosowanie również do procesów potomnych.
Należy pamiętać, że w grę wchodzi sytuacja wyścigu, która może (przynajmniej teoretycznie) spowodować, że niektóre procesy potomne nie będą poprawnie ograniczane . Ponieważ jednak „obecnie używasz cpulimit
, który i tak działa w przestrzeni użytkownika, już nie masz w 100% niezawodnych limitów procesora więc ten stan wyścigu nie powinien być dla ciebie przełomem.
Dość obszernie pisałem o demonie silnika reguł cg w mojej odpowiedzi własnej:
Odpowiedź
Prawdopodobnie nie możesz „t.
cpulimit
” Logika jest dość prosta, zajmuje pid procesu i po prostu wysyła jego sygnał kill -STOP $PID
, a następnie kill -CONT $PID
i znowu, i znowu, i znowu, i jeszcze raz ……
A mierzenie wykorzystania procesora w celu obliczenia opóźnienia między STOP a CONT.
W twoim przypadku pstree
złożonego skryptu bash zajmie N * x ekrany konsoli.
Mogę zaproponować Ci inną metodę obniżenia poziomu wykorzystania procesora przez dowolny skrypt bash lub nawet plik binarny.
1) nice
– proces jego przejmowania i zwiększania lub zmniejszania jego priorytetu z -20 (najwyższy priorytet) do 20 (najniższy priorytet). Prawdopodobnie w zbyt niskim diapazonie, dlatego pojawiają się kolejne dwa narzędzia i haki jądra:
2) ionice
– może to druga generacja nice
. Możesz oddzielić procesy według priorytetu od 0 (najniższy priorytet) do 7 (najwyższy priorytet). Ponadto można było oddzielić procesy według klas, czasu rzeczywistego (najwyższe), best-efforts
(średnie), bezczynne (najniższe) i Brak (domyślne).
3) chrt
– najwyższa rzecz, jaką kiedykolwiek spotkałem, jest podobna do cpulimit
swoją mocą i panowanie nad procesem. Tutaj również możesz spotkać klasy priorytetów, idle
, real-time
, fifo
, batch
, itd … I diapason priorytetów bardzo duży, od 1 do 99.
Na przykład, możesz uruchomić jeden ogromny proces za pomocą chrt -r -p 99 process
– i pochłonie wszystkie twoje zasoby.
W ten sam sposób każdy ogromny demon mógłby miękko działać w tle z chrt -r -p 0 process
– będzie czekał na wszystkich pozostałych, gdy zasoby systemu są zajęte.
W każdym razie gorąco zachęcam do przeczytania man chrt
i man ionice
przed rozpoczęciem.
Na przykład używam rtorrent
dla p2p. Jest to zadanie o najniższym priorytecie dla mojego systemu, więc uruchamiam je w taki sposób:
nice -n 20 chrt -i 0 ionice -c3 /usr/bin/rtorrent
Lub możesz wziąć haczyki & haks-way. I napisz własny skrypt cpulimit_wrapper. Na przykład:
# 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
Odpowiedź
Teraz najlepszym sposobem dla mnie było uruchomienie skryptu, który pozwala cpulimit kontroluj procesy w tle z 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.
Edytuj, które procesy są używany w skrypcie i pozwól mu działać. cpulimit będzie działał w tle i będzie obserwował żądane procesy i ograniczy jego użycie. Jeśli którykolwiek z procesów zostanie zakończony, cpulimit pozostanie i ogranicz procesy, jeśli kiedykolwiek ożyją.
(Napotkałem dziwny problem, gdy próbowałem uruchomić ffmpeg przez pętlę for w terminalu. To paradoksalnie wywołało dwie instancje ffmpeg, które sprawiły, że cpulimit „prawie u nie. Nie mogłem znaleźć rozwiązania problemu. Więc nawet jeśli jest to tylko pętla for, być może trzeba będzie napisać skrypt to.)
Odpowiedź
Użyj parametru -P
i umieść ścieżkę bezwzględną przed wykonywalny.
Odpowiedź
Próbowałem skonfigurować alias dla cpulimit -l 50 ffmpeg
w .bashrc
alias ffmpegl = "cpulimit -l 50 ffmpeg"
a następnie użyłem go w moim skrypcie z następującym kodem do aliasów źródłowych
shopt -s expand_aliases source /home/your_user/.bashrc
Teraz mogę używać cpulimit z ffmpeg w dowolnym miejscu skryptu dla wielu poleceń używających aliasu. Testowane na naukowym Linuksie 6.5. Działa doskonale.
Komentarze
- niestety, polecenie cpulimit przechodzi w tło, uniemożliwiając iteracyjne tworzenie skryptów
- Ja też to spotkałem; jako obejście, jeśli iteracje nie są bardzo złożone, użyj kombinacji ' znajdź ' potokowany do ' xargs ' wykonał pracę za mnie.
Dodaj komentarz