Linux-Prozess mit sehr, sehr niedriger Priorität ausführen?

12

Ich habe einen regulären Prozess, der nicht so wichtig ist, aber so viel CPU-Leistung verbraucht, und ich habe einen anderen Prozess, der wirklich wichtig ist, aber die meiste Zeit im Leerlauf verbringt, aber wenn er einen Job hat, braucht er wirklich hohe Rechenleistung

Ich habe versucht , läuft mit nice -20 ./low_priority_processund nice --20 ./high_priority_processaber immer noch die niedrigere Priorität verbrauchen erhebliche Menge an CPU , wenn eine hohe Priorität Prozess in Not ist, wie kann ich einen Prozess ausführen , die wirklich oder sogar nachgeben wird automatisch auszusetzen , wenn ein anderer Prozess CPU - Leistung mit

uray
quelle
Wie stellen Sie fest, dass der Prozess mit hoher Priorität tatsächlich benötigt wird?
Muru
es wird eine Menge Threads
erzeugen
Verwenden Sie die RRZeitplanung für den Prozess mit hoher Priorität.
Ramesh
@Ramesh Welchen möglichen Unterschied macht das?
Ken Sharp

Antworten:

10

Werfen Sie einen Blick auf cgroups , es sollte genau das bieten, was Sie brauchen - CPU-Reservierungen (und mehr). Ich würde vorschlagen, die Kontrollpriorität von Anwendungen mithilfe von cgroups zu lesen .

Wenn Sie jedoch die wichtigen, aber häufig inaktiven Prozesse mit zugewiesenen 95% der CPU und Ihre anderen Anwendungen in eine andere mit zugewiesenen 5% zusammenfassen, erhalten Sie bei Bedarf (fast) die gesamte Leistung für Ihre Jobs, während die ständig Der leistungshungrige Prozess wird zu diesen Zeiten höchstens 5% betragen. Wenn die Rechenschübe verschwinden, wird die gesamte CPU-Leistung auf die verbleibenden Prozesse geworfen. Wenn Sie eine spezielle cgroup (mit minimalen Leistungsanforderungen) für Prozesse wie sshderstellen, können Sie sich anmelden, unabhängig davon, was versucht, die gesamte CPU zu erhalten. Einige CPU-Zeit wird dafür reserviert sshd.

Peterph
quelle
1
Gibt es einen Befehl wie cpulimitoder nicezum Ändern der Prozessgruppe? weil ich, wenn cgroup ein API-Aufruf ist, ich in der Lage bin, keine dieser Apps neu zu kompilieren, um cgroup zu verwenden
uray
Nein, Sie mounten die cgroup-Hierarchie einfach irgendwo, erstellen Verzeichnisse pro Gruppe und schreiben PIDs von Prozessen in einige Dateien. All dies muss als root erfolgen (oder genauer gesagt mit entsprechenden Berechtigungen). Einige Init-Systeme ( systemdzumindest in einigen Fällen) "stehlen" die cgroups-Schnittstelle von Benutzern, die die Init-Systemschnittstelle verwenden müssen (normalerweise ein spezieller Befehl). Lesen Sie die verknüpfte Antwort und den Wikipedia-Artikel. Ja wirklich. :)
Peterph
Oh, und es gibt auch ein libcgroupPaket, das Dienstprogramme für die Arbeit mit cgroups enthält, einschließlich eines daemon ( cgrulesengd), der Prozesse abhängig von bestimmten Bedingungen tatsächlich in Gruppen sortieren kann.
Peterph
6

Wenn die Prozesspriorität (netter Wert) niedrig ist, wird ein Prozess mit höherer Priorität nicht unterbrochen. Der Grund dafür, dass der Prozess mit niedriger Priorität immer noch eine erhebliche Menge an CPU verbraucht, wenn der Prozess mit höherer Priorität ausgeführt wird, liegt darin, dass der Prozess mit höherer Priorität nicht so beschäftigt ist. Wahrscheinlich auf IO warten. Verwenden Sie chrt -p -i 0 $PIDdiese Option , um den Prozess mit einer noch niedrigeren Priorität als auszuführen nice 19 -p $PID(vorausgesetzt, es handelt sich hier um Linux).

chrt -p -i 0 $PID Setzt den Prozess in den "wahren" Leerlaufplaner.

http://linux.die.net/man/1/chrt

Ken Sharp
quelle
2
chrt -p -i 0 $ PID
Robert Foss
chrt ist immer noch nicht genug. Ich versuche, Videos anzusehen, während andere Videos im Hintergrund neu codiert werden. Die Verwendung von chrt half bei YouTube-Videos, aber mkvs von sehr hoher Qualität überspringen immer noch. Was ich mir gewünscht habe, ist, mein Video normal abzuspielen, aber jede verbleibende CPU-Leistung für die Neucodierung zu verwenden, da ich eine große Menge zu tun habe.
Soger
0

Versuchen Sie dieses Beispiel, um einen Prozess als niedrigen Prozess auszuführen.

Wenn Ihr Job ist nett tar xvf asets.zip

Verwenden

schöne tar xvf assets.zip

Danach Ausgabe

oben, um den Prozess zu überwachen, entpacken mit

ps aux | grep "tar"

Probieren Sie mit cpulimit etwas Bestimmtes aus

wget -O cpulimit.zip https://github.com/opsengine/cpulimit/archive/master.zip
unzip cpulimit.zip
cd cpulimit-master
make
sudo cp src/cpulimit /usr/bin

cpulimit -l 50 python 0 9999999999> / dev / null &

Unixmiah
quelle
Ja, -20ist "niedrige Priorität" und --20ist "hohe Priorität". Schauen Sie sich den doppelten Strich für den niceBefehl an. und ja, ich verstehe den guten Wert vollständig, aber meine Frage ist, gibt es eine andere Möglichkeit, dem Scheduler zu sagen, als einen guten Wert zu verwenden
uray
2
@ user77710 bist du sicher? Weder die Ubuntu-Manpage noch die POSIX-Manpage geben diese Syntax an. Sowohl Verwendung -n -20, -n 20usw.
muru
Ja, was auch immer, die Syntax ist nicht wichtig, mein Punkt ist, einen schönen Wert von sehr niedrig und sehr hoch für beide Prozesse
festzulegen.
2
@ user77710 WAS? "Die Syntax ist nicht wichtig"? Wie können Sie sicher sein, dass Sie dann die Werte für die Schönheit einstellen?
Muru
weil ich den Prozess sehen kann, schöner Wert auf htopoder topoder psoder was auch immer
uray
-1

Für zukünftige Ankömmlinge, hier ist ein vollständiges Beispiel nicemit Stress .

  1. Die Testmaschine verfügt über 2 CPUs
$ lscpu
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              2 
On-line CPU(s) list: 0,1
Thread(s) per core:  2
...
  1. Installieren stress:apt-get install stress
  2. Machen Sie die 2 CPUs mit einem Anruf mit niedriger Priorität beschäftigt, um Stress zu verursachen: nice -20 stress --cpu 2
  3. Überprüfen Sie die CPU-Auslastung mit top:
                                                 v
                                                 v
                                                 v
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                   
15894 ubuntu    39  19    8240     96      0 R  99.7  0.0   0:06.43 stress                                                                                    
15895 ubuntu    39  19    8240     96      0 R  99.7  0.0   0:06.42 stress                                                                                    

Dies zeigt, dass beide CPUs voll belegt sind.

  1. Starten Sie einen Einzel-CPU-Stressprozess mit hoher Priorität: nice --20 stress --cpu 1
  2. Überprüfen Sie die CPU-Auslastung erneut mit top
                                                 v
                                                 v
                                                 v
                                                 v
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                   
15928 ubuntu    20   0    8240    100      0 R  99.7  0.0   0:24.02 stress                                                                                    
15894 ubuntu    39  19    8240     96      0 R  51.2  0.0   1:12.46 stress                                                                                    
15895 ubuntu    39  19    8240     96      0 R  48.8  0.0   1:12.35 stress                                                                                    

Dies zeigt, dass der Single-Core-Stress-Prozess seine volle CPU erhält, während die Prozesse mit niedrigerer Priorität beide die verbleibende 1 CPU gemeinsam nutzen

  1. Auf der anderen Seite würde das Beenden aller oben genannten stressAufrufe und das Auslösen eines einzelnen 3-Prozesses jeweils stress --cpu 366% CPU ergeben
Shadi
quelle