Wie stelle ich den CPU-Frequenzskalierungsregler für alle Kerne gleichzeitig ein?

37

Ich möchte den CPU-Frequenzskalierungsregler für alle Kerne gleichzeitig festlegen, anstatt ihn für jeden Kern einzeln auszuführen. Gibt es eine Möglichkeit, dies zu tun?

(Ich weiß, es wäre einfach, den Gouverneur anzusprechen /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor, aber ich bin nicht auf der Suche nach einer benutzerdefinierten Lösung.)

Drehmoment
quelle
2
Mit "benutzerdefinierte Lösung" meinen Sie, dass ein Shell-Skript nicht akzeptabel ist, es muss eine integrierte GUI-Schaltfläche sein?
jg-faustus
Ich frage mich nur, ob es in einer Standardinstallation bereits eine Lösung gibt (keine GUI erforderlich).
htorque
Überprüfen Sie diese Seite: idebian.wordpress.com/2008/06/22/cpu-frequency-scaling-in-linux unter "Debian-Implementierung": Es ist anscheinend möglich, die Boot-Standardeinstellung zu ändern, und es gibt ein Userspace-Tool namens powernowd. (Dies ist eher ein Kommentar als eine Antwort, da der Beitrag aus dem Jahr 2008 stammt und ich nicht getestet habe, ob er noch funktioniert ...)
jg-faustus

Antworten:

25

Ich bin immer noch ein Linux-Neuling, aber denkst du nicht, dass cpufrequtils es dir erlaubt, indem du es benutzt?

sudo apt-get install cpufrequtils
sudo cpufreq-set -r -g performance
  • Das -rFlag wird verwendet, um die Änderung für alle ("hardwarebezogenen") Kerne festzulegen
user49449
quelle
6
Die Option -r ist nicht für alle Kerne verfügbar. Wir müssen die CPU-Nummer mit der Option -c <Nummer> angeben. Dieses Skript erledigt dies jedoch für alle CPUs auf einmal: for ((i = 0; i <$ (nproc); i ++)); Führen Sie cpufreq-set -c $ i -r -g aus. erledigt
Sri
6
Genau, @Sri ist richtig. cpufreq-setin der Tat fehlt letztendlich einfache, aber benötigte Funktionalität. Viele Leute, wie dieser Stimmenzähler eindeutig zeigt, sind sich dessen einfach nicht bewusst, weil seine Beschreibung einfach irreführend ist, um das Ganze abzurunden.
Poige
2
Wer gibt diese +1 ohne zu testen ???? Das geht gar nicht. Ich habe die einfachste funktionierende Lösung gepostet, die ich finden konnte.
switch87
20

Ich habe viel gegoogelt und denke, das ist einfach nicht möglich. Deshalb habe ich meinen folgenden Einzeiler hinzugefügt .bashrc:

function setgov ()
{
    echo "$1" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor 
}

Jetzt kann ich so etwas ausführen setgov ondemandund alle Kerne werden auf den On-Demand- Gouverneur umgestellt .

Drehmoment
quelle
2
Dies funktioniert nicht, da die Datei scaling_governor Eigentum von root ist und eingeschränkte Berechtigungen hat. Das Ändern der Berechtigungen wird nicht immer empfohlen.
Sri
Bitte beachten Sie das alternative Skript in meinem Kommentar zur Antwort von user49449.
Sri
6

Der kürzeste Befehl zum Ändern des Governors aller Kerne lautet wie folgt:

sudo bash -c 'for i in {0..7}; do cpufreq-set -c $i -g performance; done'

Sie könnten es zu .bashrc hinzufügen, wie in htorque erwähnt, Sie müssen es als root ausführen sudo setgov performance:

function setgov ()
{
     for i in {0..7}; 
     do 
         cpufreq-set -c $i -g $1; 
     done
}
switch87
quelle
2

Sie können auch die Bash-Code-Vervollständigung hinzufügen, während wir dabei sind:

function setgovernor () {
    echo "$1" | sudo tee 
    /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor 
}
complete -W "$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors)" setgovernor
Ray Malanga
quelle
2

Die Art und Weise, wie ich dies einstelle, bleibt unverändert, da der Gouverneur ab Ubuntu 16.04 (oder neuer) nach ca. 30 Sekunden standardmäßig auf Powersave zurückgesetzt wird.

  1. Setzen Sie diesen (eine Zeile) Code ein (danke, mit freundlicher Genehmigung von switch87 in der vorherigen Antwort)

    sleep 60 && bash -c 'for i in {0..7}; do cpufreq-set -c $i -g performance; done'
    
  2. in die Datei im Verzeichnis

    /etc/rc.local
    

Meins ist eine Zeile über "exit 0" und unkommentiert unter den kommentierten.

"rc.local" für diejenigen, die es nicht wissen, führt es den Befehl als sudo aus. Jeder Befehl, der den Governor zu ändern scheint, muss als sudo ausgeführt werden.

Damit kann der Governor wieder auf Powersave zurückgesetzt werden und der Code wird nach 60 Sekunden als sudo ausgeführt, um die Leistung wiederherzustellen.

Ändern Sie die "60" (in dem Code, den Sie kopieren) in die Zeit (in Sekunden. 60 = 60 Sekunden = 1 Minute), die Sie benötigen, um den Befehl und die "Leistung" (im Befehlsteil) auf den gewünschten Regler zu verschieben ändern.

Nach stundenlangem Suchen habe ich keine dauerhaftere Lösung dafür gefunden. Ich denke, in ein paar Minuten ist es auf Energiesparmodus, wenn dies die beste Lösung ist, die ich gefunden habe, oder? Richtig.

Dies ist nicht die beste Lösung, macht es aber etwas dauerhafter, nachdem es das kleine Umschalten auf Powersave macht. Wenn Sie hochfahren und in ein Spiel oder etwas anderes springen möchten, müssen Sie eine Minute auf den Code warten, den Sie gerade eingegeben haben, um ihn aus dem Energiesparmodus zurückzuschalten, oder das Timing verringern (je nachdem, wie lange es dauert) alles, um hochzufahren, damit es wieder richtig funktioniert).

Und, wie immer, um auf die Standardeinstellungen zurückzukehren (ich habe einige Probleme mit der Überhitzung der PCs der Leute gesehen, weshalb sie diese möglicherweise standardmäßig auf Powersave eingestellt haben), entfernen Sie einfach den Code aus rc.local und starten Sie ihn neu oder schalten Sie ihn zurück manuell mit dem CPU-Symbol-Indikator wechseln oder ausführen;

 sudo /etc/init.d/cpufrequtils restart

im Terminal und oder neu starten.

Roiikka
quelle
1

Sie können dies für alle Kerne gleichzeitig ausführen

sudo cpupower frequency-set --governor performance
Martin Andersson
quelle
0

Basierend auf der Antwort von switch87 habe ich ein einfaches Skript erstellt cpufreq-set-all, das es ermöglicht, cpufreq-setmit allen CPUs andere Dinge zu tun :

   #!/bin/bash
   MAX_CPU=$((`nproc --all` - 1))
   for i in $(seq 0 $MAX_CPU); do
       echo "Changing CPU " $i " with parameter "$@;
       cpufreq-set -c $i $@ ;
   done

Jetzt kann es ( chmod +xnatürlich danach) so aufgerufen werden :

cpufreq-set-all -g powersave

oder

cpufreq-set-all -f 800Mhz
side2k
quelle