Verlangsamen Sie nur einen Prozess, um die CPU-Temperatur zu regulieren

9
  1. Ich habe ein Programm. Wenn es läuft, steigt die CPU-Temperatur von 50 auf 80 Grad Celsius, was mein Hauptanliegen ist.

    Ich kann die CPU-Frequenz steuern, um sie zu verlangsamen, aber auch andere Prozesse werden verlangsamt, was ich nicht möchte.

    Ist es möglich, einen bestimmten Prozess zu verlangsamen, ohne andere Prozesse zu beeinflussen, um die CPU kühl zu halten?

    Mein Betriebssystem ist Ubuntu 10.10.

  2. Ich habe versucht, die Priorität des Prozesses durch festzulegen nice -n 15 myprogram, und bin mir nicht sicher, ob dies funktionieren wird. Die CPU ist 77 Celcius hoch.

    Ist nicenur eine relative Priorität eines Prozesses WRT anderen Verfahren festgelegt? Dh wenn andere Prozesse nicht ausgeführt werden, wird dieser gewürfelte Prozess schnell ausgeführt? Ich möchte den Prozess so einstellen, dass er durchgehend langsam läuft.

Tim
quelle
1
Was macht dieser Prozess: starke Eingabe / Ausgabe? Schwere Berechnungen auf der Haupt-CPU? Schwere Berechnungen auf der GPU (Grafikkarte) (normalerweise, aber nicht beschränkt auf Programme, die Bilder berechnen)?
Gilles 'SO - hör auf böse zu sein'
Das Programm ist pdf2djvu und konvertiert eine PDF-Datei in djvu. Ist es schwere E / A oder schwere CPU oder schwere GPU? Haben Sie verschiedene Möglichkeiten für verschiedene Fälle?
Tim
4
80º ist sehr sehr hoch. Ich lebe an einem heißen Ort in Spanien und die maximale Temperatur meines Prozessors beträgt ~ 60º. Öffnen Sie den Computer, reinigen Sie alle Teile und wechseln Sie die Kühler. Ich denke, du bist nicht die CPU-Nutzung.
Rufo El Magufo
Versuchen Sie beides.
Stribika
80 ° ist tatsächlich hoch, wird jedoch je nach CPU-Modell nicht als extrem angesehen. Die meisten CPUs unterstützen bis zu 90 ° C ohne
Probleme

Antworten:

16

CPULimit ist genau das, was Sie brauchen. Sie starten das Programm und führen dann cpulimit für den Programmnamen oder die PID aus. Geben Sie dabei an, wie viel Prozent Sie darauf beschränken möchten.

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 der Prozentsatz aller Kerne ist. Wenn Sie also 4 Kerne haben, können Sie 400% verwenden.

Laebshade
quelle
1
Vielen Dank! (1) Wird CPULimit nur für bereits ausgeführte Prozesse verwendet? Wird beim Senden eines Programms zur Ausführung nicht verwendet? (2) Wird der Prozentsatz der CPU-Auslastung durch einen Prozess festgelegt oder die Obergrenze für den Prozess festgelegt und die Auslastung gemäß anderen Prozessen zwischen 0 und dieser Grenze schwanken lassen? (3) Ich habe auch festgestellt, dass es nach der Verwendung von CPULimit für einen Prozess keine Möglichkeit gibt, die Ausführung mit Strg + C abzubrechen, da sie bald wieder automatisch ausgeführt wird. Fragen, warum?
Tim
2
Eine kleine Einschränkung zu CPULimit: Es verwendet SIGSTOP / SIGCONT, um die von einem Prozess verwendete CPU-Zeit zu begrenzen (Prozesse, die die Ziel-CPU-Auslastung überschreiten, werden gestoppt; wenn genügend Zeit verstrichen ist, wird dem Prozess ein SIGCONT gesendet und die Ausführung fortgesetzt). Es gibt jedoch seltene Fälle, in denen Signale Systemaufrufe stören können. Weitere Informationen finden Sie im Handbuch der GNU C-Bibliothek . Da CPULimit diese Signale viele Male pro Sekunde sendet, besteht die Möglichkeit einer Unterbrechung. Kein großes Problem für die Ausführung von pdftk auf einem Desktop.
Riccardo Murri
8

Sie können renice einen laufenden Prozess , um ihn mehr oder weniger Priorität (die so genannten „nice value“). Beachten Sie, dass die UNIX-Prioritätsskala etwas kontraintuitiv ist: Negative Werte bedeuten, dass ein Prozess gegenüber gleichzeitigen Prozessen bevorzugt wird, dh "mehr" Priorität hat.

Sie können also versuchen, Ihren Prozess aufgrund seiner PID zu "verlangsamen" durch:

# lower priority of a process
renice +1 "PID"

Jedes Mal, wenn Sie dies ausführen, wird der Prozess "nice value" um 1 erhöht. Sie können andere als +1natürlich ganzzahlige Werte verwenden .

Mit dem Befehl nice können Sie einen Prozess mit einer +10 nice value-Anpassung starten (ändern Sie dies mit der Option -n). Zum Beispiel:

# start a CPU-intensive task with low priority
nice ./cpu-hog

Der "nette Wert" wirkt sich jedoch nur darauf aus, wie sehr der Scheduler die Ausführung eines bestimmten Prozesses gegenüber anderen im System bevorzugt: Wenn Ihr Computer im Grunde genommen im Leerlauf ist, wird durch Erhöhen des "netten Werts" eines einzelnen Prozesses nicht verhindert , dass dieser Prozess 100% dauert ZENTRALPROZESSOR. Ich zitiere aus der Manpage getpriority (2) : (Hervorhebung von mir hinzugefügt.)

Das Ausmaß, in dem sich ihr relativer Wert auf die Planung von Prozessen auswirkt, variiert zwischen Unix-Systemen und unter Linux zwischen Kernelversionen. 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 nette Werte (+19) einem Prozess wirklich wenig CPU zur Verfügung stellen, wenn das System eine andere Last mit höherer Priorität hat.

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 einen Prozess ausführt, hat dieser Prozess für einen bestimmten (festen und kurzen) Zeitraum die volle Kontrolle über einen CPU-Kern. Der "nette Wert" kann beeinflussen, wie oft der Kernel-Scheduler bereit ist, einem Prozess ein Zeitfenster zuzuweisen. Sie können jedoch nicht die Tatsache ändern, dass ein Prozess nach dem Planen für einen festgelegten Zeitraum ungestört ausgeführt wird.

Wenn Sie Ihre CPU nicht verlangsamen, kann ein Prozess daher nicht langsamer ausgeführt werden, wenn keine anderen Prozesse im System vorhanden sind, die um den CPU-Zugriff kämpfen können.

Riccardo Murri
quelle
Vielen Dank! Ist es möglich, einen Prozess von Anfang bis Ende langsam laufen zu lassen, unabhängig von anderen Prozessen?
Tim
@ Tim Ich glaube nicht, dass das, was du fragst, möglich ist. Ich habe die Antwort mit weiteren Details aktualisiert. Hoffe das macht es klarer.
Riccardo Murri
1
Die andere Antwort schlug CPULimit vor, was das Unmögliche zu tun scheint.
Tim
Ah, ich wusste nichts über CPULimit - es füllt definitiv eine Lücke in meinem UNIX-Toolset.
Riccardo Murri
nicewird nichts tun, um Ihren Prozessor kühl zu halten. Es ist nicht dafür ausgelegt, so zu funktionieren.
Ken Sharp
4

Aus genau diesem Grund wurden cgroups 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, bis Sie sich mit ihnen vertraut gemacht haben, und ich glaube, Sie benötigen Root-Zugriff, um sie einzurichten, aber alles kann per Skript ausgeführt werden. Die neueren Ubuntus haben eine .conf-Datei, so dass Sie kein eigenes Skript schreiben müssen. Ich bin mir über 10.10 nicht sicher.

Ein guter Anfang ist in dieser Antwort: /ubuntu//a/94743/170177

Beachten Sie, dass sich cgroups noch in der aktiven Entwicklung befindet, sodass einige Funktionen in Ihrem aktuellen Kernel möglicherweise nicht verfügbar sind.

Die Verwendung von cpu.shares von cgroups bewirkt nichts, was ein netter Wert nicht tun würde. 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 und cpu.cfs_quota_us bearbeiten . Der Prozess wird dann erlaubt werden , für laufen cpu.cfs_quota_us Mikrosekunden pro cpu.cfs_period_us Mikrosekunden.

Zum Beispiel:

Wenn cpu.cfs_period_us = 50000 und cpu.cfs_quota_us = 10000 , erhält der Prozess 20% der maximalen CPU-Zeit, unabhängig davon, was sonst noch vor sich geht.

In diesem Screenshot habe ich dem Prozess 2% der CPU-Zeit gegeben:

2% CPU-Zeit

Der Prozess läuft zu 100%.

Einstellungen cpu.shares hingegen können und werden 100% der Leerlauf-CPU-Zeit nutzen.

In diesem ähnlichen Beispiel habe ich den Prozess cpu.shares = 100 (von 1024) angegeben:

cpu.shares

Wie Sie sehen, verbraucht der Prozess immer noch die gesamte Leerlaufzeit der CPU.

Verweise:

http://manpages.ubuntu.com/manpages/precise/man5/cgconfig.conf.5.html http://kennystechtalk.blogspot.co.uk/2015/04/throttling-cpu-usage-with-linux-cgroups .html

Ken Sharp
quelle
Hinweis: systemdmacht die Dinge etwas anders. Ubuntu Trusty zum Beispiel scheint mit zwei Diensten zum Verwalten von Gruppen zu kommen. Ich werde aktualisieren, wenn ich mehr weiß.
Ken Sharp
Aber Sie können die maximale CPU% ändern, wenn der Prozess bereits gestartet ist, wie renice?
Marco Sulla
reniceändert nicht die Menge der verwendeten CPU, sondern nur die Priorität des Prozesses im Scheduler. cgroups können das CPU-Limit jederzeit ändern. Seit diese Antwort veröffentlicht wurde, haben cgroups alle Arten von Optimierungen hinzugefügt und sind sehr mächtig.
Ken Sharp
renice does not change the amount of CPU usesIch weiß es;) Ich habe gerade als Beispiel für ein Programm gepostet, das Dinge zur Laufzeit ändert. Vielen Dank für Ihre Antwort, ich werde cgroups versuchen.
Marco Sulla