Linux: Warum schwankt die CPU-Frequenz bei Verwendung des Performance Governors?

8

Ich verwende eine Debian 8 amd64-Maschine zum Benchmarking. Während des Experimentierens möchte ich, dass die CPU mit einer festen Frequenz (vorzugsweise der maximal möglichen) arbeitet. Dies schließt die CPU-Taktrate als Quelle für Abweichungen in den Ergebnissen aus.

Nach einigem Lesen scheint es richtig zu sein, den CPU-Regler auf zu ändern performance, was hier in der Linux-Kernel-Dokumentation beschrieben wird :

Der CPUfreq-Regler "Leistung" setzt die CPU statisch auf die höchste Frequenz innerhalb der Grenzen von scaling_min_freq und scaling_max_freq.

Leider werden weitere Details zu scaling_min_freqund scaling_max_freqnicht geliefert. Hoffentlich sollte es keine Rolle spielen, da die verwendete CPU-Frequenz der Maximalwert des Intervalls ist.

Also habe ich diesen Governor mit cpufreq-set aktiviert:

$ cat / sys / device / system / cpu / cpu * / cpufreq / scaling_governor
Performance
Performance
Performance
Performance

Und für ein gutes Maß habe ich auch den Turbo-Boost-Modus im BIOS deaktiviert:

$ cat / sys / device / system / cpu / intel_pstate / no_turbo
1

Basierend auf der obigen Beschreibung des Leistungsreglers würde ich keine Schwankung der CPU-Taktrate erwarten. Wenn ich jedoch wiederholt renne cpufreq-info, sehe ich, dass die Taktrate schwankt:

$ cpufreq-info | grep 'aktuelle CPU fr'
  Die aktuelle CPU-Frequenz beträgt 4,00 GHz.
  Die aktuelle CPU-Frequenz beträgt 3,99 GHz.
  Die aktuelle CPU-Frequenz beträgt 4,00 GHz.
  Die aktuelle CPU-Frequenz beträgt 4,00 GHz.
$ cpufreq-info | grep 'aktuelle CPU fr'
  Die aktuelle CPU-Frequenz beträgt 4,00 GHz.
  Die aktuelle CPU-Frequenz beträgt 4,00 GHz.
  Die aktuelle CPU-Frequenz beträgt 4,00 GHz.
  Die aktuelle CPU-Frequenz beträgt 3,96 GHz.
$ cpufreq-info | grep 'aktuelle CPU fr'
  Die aktuelle CPU-Frequenz beträgt 4,00 GHz.
  Die aktuelle CPU-Frequenz beträgt 4,00 GHz.
  Die aktuelle CPU-Frequenz beträgt 4,00 GHz.
  Die aktuelle CPU-Frequenz beträgt 3,94 GHz.
$ cpufreq-info | grep 'aktuelle CPU fr'
  Die aktuelle CPU-Frequenz beträgt 4,01 GHz.
  Die aktuelle CPU-Frequenz beträgt 4,00 GHz.
  Die aktuelle CPU-Frequenz beträgt 4,00 GHz.
  Die aktuelle CPU-Frequenz beträgt 3,98 GHz.

Liegt diese Schwankung an der Hardware, dem BIOS, dem Kernel oder einem anderen Faktor? Gibt es eine Möglichkeit, die CPU-Frequenz so einzustellen, dass sie überhaupt nicht schwankt?

Edd Barrett
quelle
Welche Art von Serverhardware verwenden Sie? Was sind die BIOS-Leistungs- und CPU-Leistungseinstellungen dieser Hardware?
ewwhite
Es ist eigentlich ein Desktop-Computer mit einer i7-CPU. Ich habe dmesg und cpuinfo hier hochgeladen: gist.github.com/vext01/73eea539eb041acf784b . Betreff: BIOS-Einstellungen, ich müsste zur Maschine gehen und schauen. Gibt es eine bestimmte Einstellung, an die Sie denken?
Edd Barrett
Das ist keine "große" Schwankung im Vergleich zu normalen Pstate-Variationen ... :)
Rogerdpack

Antworten:

7

Nach einigen Experimenten denke ich, dass ich meine eigene Frage beantworten kann.

Wie in diesem Thread erwähnt , gibt es auf bestimmter Intel-Hardware zwei Möglichkeiten, die CPU-Frequenz zu verwalten:

  • Mit pstate.
  • Verwenden Sie reguläres ACPI.

Wenn pstate verwendet wird, hat das BIOS ein gewisses Mitspracherecht bei der Taktrate, und es scheint, dass dies die Ursache für die Schwankungen ist.

Sie können pstate deaktivieren, indem Sie intel_pstate=disablean die Kernel-Argumente anhängen (bearbeiten /etc/default/grubSie das Argument und fügen Sie es hinzu GRUB_CMDLINE_LINUX_DEFAULT. Führen Sie es schließlich aus sudo update-grub).

Danach cpufreq-infosieht die Ausgabe von ganz anders aus, und ich stelle auch fest, dass ein anderer Satz von CPU-Reglern verfügbar wird (z. B. ondemandjetzt verfügbar).

Am wichtigsten ist, dass nach dem Einstellen des performanceReglers die Taktrate jetzt fest ist (in meinem Fall auf 4,00 GHz).

Sie können nachsehen /sys/devices/system/cpu/cpu*/cpufreq/scaling_driver, ob pstate oder ACPI zum Skalieren der CPU verwendet wird. Diese Dateien können die Werte acpi-cpufreqoder annehmen intel_pstate.

Edd Barrett
quelle
Ein weiterer Trick: Verwenden Sie ´lsmod´, um die vom Kernel geladenen Module aufzulisten, alle Module in Bezug auf die Skalierung der CPU-Geschwindigkeit / p-state / c-state / Whatever auf die schwarze Liste zu setzen und den Computer neu zu starten. Suchen Sie nach "Blacklist-Kernelmodulen".
Rufo El Magufo
4

Bei modernen Intel-Prozessoren wird die Frequenz vom Prozessor selbst gesteuert, und die P-Zustände, die der Software ausgesetzt sind, hängen mit den Leistungsniveaus zusammen. Die Idee, dass die Frequenz auf eine einzelne Frequenz eingestellt werden kann, ist für Intel Core-Prozessoren eine Fiktion . Selbst wenn der Skalierungstreiber einen einzelnen P-Zustand auswählt, wird die tatsächliche Frequenz, mit der der Prozessor ausgeführt wird, vom Prozessor selbst ausgewählt. [1]

[1] https://www.kernel.org/doc/Documentation/cpu-freq/intel-pstate.txt

SaveTheRbtz
quelle
Interessant. Gilt das also immer noch, wenn ich intel_pstate=disablean den Kernel übergebe? Rufe ich dabei den "Legacy-Modus" auf?
Edd Barrett
1) nicht sicher. müssen mit Intel Architectures Software Developer's Manual.2) ja konsultieren . PS. Sie können auch mitx86_energy_perf_policy
SaveTheRbtz
Danke für deine Kommentare. Da ich mir immer noch nicht sicher bin, lasse ich die Frage vorerst offen. Vielleicht wird später jemand Licht in die Situation bringen.
Edd Barrett
-1

Ich habe diesen Thread gelesen, weil ich zu sehr darauf aus war, eine feste Frequenz für meine CPU einzustellen, da der Lüfter nicht mehr funktioniert (natürlich passieren diese Dinge, wenn Sie im Ausland auf einer verlorenen Insel sind, um zu tauchen!), also war mein Punkt mehr zu setzen Die niedrigste Frequenz (800 MHz) ..i hat es endlich geschafft, die Skalierung_max_freq in / sys / device / system / cpu / cpu * / cpufreq / für jede CPU der Konfiguration zu ändern. Jetzt ist es in Ordnung, dass sich die Frequenz von 800 MHz bewegt bis .... 800Mhz. Es funktioniert und hat das Überhitzungsproblem gelöst, das ich erlebt habe. (Die Frequenz beträgt jetzt 799 MHz und bewegt sich nicht, wodurch die CPU bei etwa 50 ° C bleiben konnte!)

PS: Ich deaktiviere auch den Turbomodus (3,1 GHz)

Steve.29
quelle