CPULimit ist genau das, was Sie brauchen. Sie starten das Programm, führen dann cpulimit gegen den Programmnamen oder die PID aus und geben an, um wie viel Prozent es begrenzt werden soll.
Der folgende Befehl begrenzt den Prozess bei PID 7777 auf 5 % CPU-Auslastung.
cpulimit -p 7777 -l 5
Alternativ können Sie den Namen der ausführbaren Datei verwenden:
cpulimit -e myprogram -l 5
Oder der absolute Pfad der ausführbaren Datei:
cpulimit -P /path/to/myprogram -l 5
Beachten Sie, dass sich der Prozentsatz auf alle Kerne bezieht; Wenn Sie also 4 Kerne haben, könnten Sie 400 % verwenden.
Sie können einem laufenden Prozess einen Renice geben, um ihm mehr oder weniger Priorität zu geben (der sogenannte »nice value«). Beachten Sie, dass die UNIX-Prioritätsskala etwas kontraintuitiv ist:Negative Werte bedeuten, dass ein Prozess gegenüber gleichzeitigen Prozessen bevorzugt wird, d. h. er hat „höhere“ Priorität.
Sie können also versuchen, Ihren Prozess anhand seiner PID zu "verlangsamen" durch:
# lower priority of a process
renice +1 "PID"
Jedes Mal, wenn Sie dies ausführen, wird der "nice value" des Prozesses um 1 erhöht; Sie können andere Ganzzahlwerte als +1
verwenden natürlich.
Mit dem Befehl nice können Sie einen Prozess mit einer Anpassung des Nice-Werts von +10 starten (ändern Sie dies mit der Option -n
). Zum Beispiel:
# start a CPU-intensive task with low priority
nice ./cpu-hog
Der "Nice-Wert" wirkt sich jedoch nur darauf aus, wie sehr der Planer die Ausführung eines bestimmten Prozesses gegenüber anderen im System bevorzugt:Wenn Ihr Computer im Grunde im Leerlauf ist, wird das Erhöhen des "Nice-Werts" eines einzelnen Prozesses nicht Stoppen Sie, dass dieser Prozess 100% CPU beansprucht. Ich zitiere aus der Manpage getpriority(2):(Hervorhebung von mir hinzugefügt.)
Das Ausmaß, in dem ihr relativer netter Wert die Planung von Prozessen beeinflusst, variiert zwischen Unix-Systemen und unter Linux zwischen Kernel-Versionen. Beginnend mit Kernel 2.6.23 hat Linux einen Algorithmus übernommen, der bewirkt, dass relative Unterschiede in netten Werten einen viel stärkeren Effekt haben. Dies führt dazu, dass sehr niedrige Nice-Werte (+19) einem Prozess wirklich wenig CPU zur Verfügung stellen wenn es andere gibt _Belastung des Systems mit höherer Priorität._
Der Grund dafür liegt in der Art und Weise, wie Prozesse auf einem UNIX-ähnlichen Kernel ausgeführt werden:Jedes Mal, wenn der Kernel entscheidet, einen Prozess auszuführen, hat dieser Prozess für eine bestimmte (feste und kurze) Zeitspanne die volle Kontrolle über einen CPU-Kern. Der "nice value" kann beeinflussen, wie oft der Kernelscheduler bereit ist, einem Prozess ein Zeitfenster zuzuweisen, aber Sie können die Tatsache nicht ändern, dass ein einmal geplanter Prozess für eine festgelegte Zeitspanne ungestört läuft.
Abgesehen davon, dass Sie Ihre CPU verlangsamen, gibt es daher keine Möglichkeit, einen Prozess langsamer laufen zu lassen, wenn es keine anderen Prozesse im System gibt, die um CPU-Zugriff konkurrieren können.
Gruppen wurden aus genau diesem Grund erstellt.
http://www.kernel.org/doc/Documentation/cgroups/http://www.serverwatch.com/tutorials/article.php/3921001/Setting-Up-Linux-Cgroups.htm
Es dauert eine Weile, sich mit ihnen vertraut zu machen, und ich glaube, Sie benötigen Root-Zugriff, um sie einzurichten, aber es kann alles per Skript ausgeführt werden. Die neueren Ubuntus haben eine .conf-Datei, sodass Sie kein eigenes Skript schreiben müssen. Bei 10.10 bin ich mir nicht sicher.
Ein guter Ausgangspunkt ist diese Antwort:https://askubuntu.com/a/94743/170177
Beachten Sie, dass sich cgroups noch in aktiver Entwicklung befindet, sodass einige Funktionen in Ihrem aktuellen Kernel möglicherweise nicht verfügbar sind.
Verwendung der cpu.shares von cgroups tut nichts, was nett ist Wert würde nicht reichen. Es hört sich so an, als ob Sie die Prozesse tatsächlich drosseln möchten, was definitiv möglich ist.
Sie müssen ein oder zwei Skripte verwenden und/oder /etc/cgconfig.conf bearbeiten um die gewünschten Parameter zu definieren.
Insbesondere möchten Sie die Werte cpu.cfs_period_us bearbeiten und cpu.cfs_quota_us . Der Prozess darf dann für cpu.cfs_quota_us ausgeführt werden Mikrosekunden pro cpu.cfs_period_us Mikrosekunden.
Zum Beispiel:
Wenn cpu.cfs_period_us =50000 und cpu.cfs_quota_us =10000 dann erhält der Prozess maximal 20 % der CPU-Zeit, egal was sonst noch passiert.
In diesem Screenshot habe ich dem Prozess 2 % der CPU-Zeit gegeben:
Was den Prozess betrifft, läuft er zu 100 %.
Einstellungen cpu.shares andererseits kann und wird er weiterhin 100 % der CPU-Leerlaufzeit nutzen.
In diesem ähnlichen Beispiel habe ich dem Prozess cpu.shares =100 gegeben (von 1024):
Wie Sie sehen können, verbraucht der Prozess immer noch die gesamte Leerlauf-CPU-Zeit.
Referenzen:
http://manpages.ubuntu.com/manpages/precise/man5/cgconfig.conf.5.htmlhttp://kennystechtalk.blogspot.co.uk/2015/04/throttling-cpu-usage-with-linux-cgroups. html