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_process
und nice --20 ./high_priority_process
aber 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
RR
Zeitplanung für den Prozess mit hoher Priorität.Antworten:
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
sshd
erstellen, können Sie sich anmelden, unabhängig davon, was versucht, die gesamte CPU zu erhalten. Einige CPU-Zeit wird dafür reserviertsshd
.quelle
cpulimit
odernice
zum Ä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 verwendensystemd
zumindest 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. :)libcgroup
Paket, 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.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 $PID
diese Option , um den Prozess mit einer noch niedrigeren Priorität als auszuführennice 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
quelle
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
cpulimit -l 50 python 0 9999999999> / dev / null &
quelle
-20
ist "niedrige Priorität" und--20
ist "hohe Priorität". Schauen Sie sich den doppelten Strich für dennice
Befehl 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-n -20
,-n 20
usw.htop
odertop
oderps
oder was auch immerFür zukünftige Ankömmlinge, hier ist ein vollständiges Beispiel
nice
mit Stress .stress
:apt-get install stress
nice -20 stress --cpu 2
top
:Dies zeigt, dass beide CPUs voll belegt sind.
nice --20 stress --cpu 1
top
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
stress
Aufrufe und das Auslösen eines einzelnen 3-Prozesses jeweilsstress --cpu 3
66% CPU ergebenquelle