cpulimit für ein Bash-Skript, das andere Befehle ausführt
On Februar 10, 2021 by adminIch habe ein Bash-Skript, das andere cpu-intensive Befehle ausführt.
Wenn ich mich bewerbe cpulimit
Im Bash-Skript zeigt die Ausgabe von top
Prozesse für die Befehle im Skript an, die weiterhin ohne Einschränkung von . Ich frage mich, wie ich die CPU-Nutzung der Befehle im Bash-Skript einschränken kann.
Antwort
Gemäß cpulimit --help
:
-i, --include-children limit also the children processes
Ich habe weder getestet, ob dies für Kinder von Kindern gilt, noch untersucht, wie dies implementiert wird.
Alternativ können Sie cgroups
, eine Kernelfunktion.
Cgroups bieten nicht nativ auch eine Möglichkeit, untergeordnete Prozesse einzuschränken, aber Sie können den bereitgestellten cg rules engine-Daemon (cgred) verwenden Nach libcgroup stellen die Befehle cgexec
und cgclassify
, die aus dem libcgroup-Paket stammen, eine --sticky
bereit Flag, damit Regeln auch für untergeordnete Prozesse gelten.
Beachten Sie, dass es sich um eine Race-Bedingung handelt, die (zumindest theoretisch) dazu führen kann, dass einige untergeordnete Prozesse nicht korrekt eingeschränkt werden Da Sie jedoch derzeit cpulimit
verwenden, das ohnehin im Benutzerbereich ausgeführt wird, haben Sie bereits keine 100% zuverlässige CPU-Begrenzung Daher sollte diese Rennbedingung kein Deal-Breaker für Sie sein.
Ich habe in meiner Selbstantwort hier ziemlich ausführlich über den Daemon der CG Rules Engine geschrieben:
Antwort
Wahrscheinlich können Sie „t.
cpulimit
“ Die Logik ist ziemlich einfach, sie erfordert viel Prozess und einfaches Senden sein Signal kill -STOP $PID
, danach kill -CONT $PID
und immer wieder und immer wieder und immer wieder ……
Und das Messen der CPU-Auslastung zur Berechnung der Verzögerung zwischen STOP und CONT.
In Ihrem Fall würde pstree
eines komplexen Bash-Skripts N * x benötigen Bildschirme der Konsole.
Ich kann Ihnen eine andere Methode vorschlagen, um die CPU-Nutzung eines Bash-Skripts oder einer ausführbaren Binärdatei herunterzustufen.
1) nice
– sein Aufnahmevorgang und Erhöhen oder Verringern seiner Priorität von -20 (höchste Priorität) auf 20 (niedrigste Priorität). Wahrscheinlich in zu niedrigem Diapason, deshalb erscheinen zwei weitere Utils und Kernel-Hooks:
2) ionice
– möglicherweise handelt es sich um eine zweite Generation von nice
. Sie können Prozesse nach Priorität von 0 (niedrigste Priorität) bis 7 (höchste Priorität) trennen. Außerdem können Sie Prozesse nach Klassen trennen: Echtzeit (Höchste), best-efforts
(Mitte), Leerlauf (Niedrigste) und Keine (Standard).
3) chrt
– das Höchste, was ich je getroffen habe, es ähnelt cpulimit
durch seine Kraft und Herrschaft über den Prozess. Auch hier können Sie Prioritätsklassen treffen: idle
, real-time
, fifo
, batch
usw. Und eine sehr große Anzahl von Prioritäten von 1 bis 99.
Sie könnten beispielsweise einen großen Prozess mit – und es wird alle Ihre Ressourcen verschlingen.
Auf die gleiche Weise kann jeder riesige Daemon mit „chrt -r -p 0 process
im“ Hintergrund „arbeiten – er wartet auf alle anderen, während die Ressourcen eines Systems ausgelastet sind.
Wie auch immer, ich empfehle Ihnen dringend, man chrt
und man ionice
zu lesen, bevor Sie beginnen.
Zum Beispiel verwende ich rtorrent
für p2p. Es ist die Aufgabe mit der niedrigsten Priorität für mein System, dann starte ich sie folgendermaßen:
nice -n 20 chrt -i 0 ionice -c3 /usr/bin/rtorrent
Oder Sie können die Hooks & haks way. Und schreiben Sie Ihr eigenes cpulimit_wrapper-Skript. Beispiel:
# 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
Antwort
Nun war der beste Weg für mich, ein Skript auszuführen, mit dem cpulimit Prozesse im Hintergrund von Askubuntu steuern:
#!/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.
Bearbeiten Sie, was Prozesse sind wird in Ihrem Skript verwendet und ausgeführt. cpulimit wird im Hintergrund ausgeführt und sucht nach abgefragten Prozessen und schränkt seine Verwendung ein. Wenn einer der Prozesse abgeschlossen ist, bleibt cpulimit weiterhin und Begrenzen Sie die Prozesse, falls sie jemals wieder lebendig werden.
(Ich bin auf ein seltsames Problem gestoßen, als ich versucht habe, ffmpeg durch eine for-Schleife im Terminal auszuführen. Dies hat paradoxerweise zwei ffmpeg-Instanzen hervorgebracht, die cpulimiting fast u gemacht haben selbstlos. Ich konnte keine Antwort auf das Problem finden. Selbst wenn es „nur eine for-Schleife“ ist, müssen Sie möglicherweise ein Skript für schreiben Dies.)
Antwort
Verwenden Sie den Parameter -P
und platzieren Sie den absoluten Pfad vor dem ausführbare Datei.
Antwort
Ich habe versucht, einen Alias für cpulimit -l 50 ffmpeg
in .bashrc
alias ffmpegl = "cpulimit -l 50 ffmpeg"
und verwendete es dann in meinem Skript mit dem folgenden Code, um Aliase zu erstellen
shopt -s expand_aliases source /home/your_user/.bashrc
Jetzt kann ich cpulimit mit ffmpeg an einer beliebigen Stelle im Skript für mehrere Befehle unter Verwendung des Alias verwenden. Getestet unter wissenschaftlichem Linux 6.5.Arbeitet perfekt.
Kommentare
- Leider tritt der Befehl cpulimit dann in den Hintergrund und macht iteratives Scripting unmöglich
- Ich bin auch darauf gestoßen; Als Problemumgehung, wenn Iterationen nicht sehr komplex sind, verwenden Sie eine Kombination aus ‚ find ‚, die an ‚ xargs ‚ hat die Arbeit für mich erledigt.
Schreibe einen Kommentar