Warum melden cpuinfo_cur_freq und / proc / cpuinfo unterschiedliche Nummern?

13

Wenn ich es tue

sudo watch -n1 cat /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_cur_freq

Ich bekomme 1,8 - 2,7 GHz. Es geht nie über 2.7.

Und wenn ich es tue

watch -n1 "cat /proc/cpuinfo | grep MHz"

Ich bekomme 768 MHz - 1,8 GHz. Es geht nie über 1,8 hinaus.

Weiß jemand was los ist?

Wulftone
quelle

Antworten:

14

Die meisten CPUs bieten jetzt die Möglichkeit, ihre Geschwindigkeit anzupassen, um den Batterie- / Stromverbrauch zu senken. Dies wird normalerweise als CPU-Frequenzskalierung bezeichnet . Die Echtzeitgeschwindigkeit der CPU wird wie folgt angegeben:

$ sudo cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq

Die absolute (maximale) CPU-Geschwindigkeit wird wie folgt angegeben:

$ cat /proc/cpuinfo

Speziell diese Zeile:

model name  : Intel(R) Core(TM) i5 CPU       M 560  @ 2.67GHz

Die angezeigte Zeile zeigt cpu MHz nicht die maximale Geschwindigkeit Ihrer CPU. Dieser Wert ist Ihre aktuelle Geschwindigkeit. Auf einem Multi-Core-System wie einem i7 oder i5 können Sie dies mit dem folgenden Befehl sehen:

$ cat /proc/cpuinfo |grep MHz
cpu MHz     : 1199.000
cpu MHz     : 1199.000
cpu MHz     : 1199.000
cpu MHz     : 2667.000

Sie können jedoch die absolute (maximale) Geschwindigkeit mit diesem Befehl sehen:

$ lscpu 
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
CPU(s):                4
Thread(s) per core:    2
Core(s) per socket:    2
CPU socket(s):         1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 37
Stepping:              5
CPU MHz:               2667.000
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              3072K
NUMA node0 CPU(s):     0-3

HINWEIS: Die Anzahl der Kerne NUMAS node0 CPU(s)beträgt 4, dh 0,1,2 und 3.

CPU-Skalierung & -Governating?

Der Modus, in dem sich Ihr System befindet, wird als Skalierungsregler bezeichnet. Ähnlich wie ein Gouverneur in einem Auto. Mit diesem Befehl können Sie sehen, welche verfügbar sind:

$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
powersave ondemand userspace performance 

Sie können auch sehen, welches aktuell aktiv ist:

$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
ondemand

HINWEIS: Die angezeigten Befehle enthalten nur die 1. CPU cpu0. Sie können entweder *in den Pfad einfügen, um alle Kerne anzuzeigen, oder Sie können selektiv cpu1usw. anzeigen .

Sie können die maximalen und minimalen CPU-Geschwindigkeiten anzeigen, die für das Profil Ihres Governors verfügbar sind:

$ sudo cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq
2667000
$ sudo cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq 
1199000

Weitere Informationen finden Sie in diesem Artikel mit dem Titel: CPU-Frequenzskalierung unter Linux mit cpufreq .

Was ist also mit cpuinfo_cur_freq?

Dieser Parameter hat mehr mit der Spezifikation der CPU und dem Profil zu tun, in dem sie sich gerade befindet, als mit irgendetwas Nützlichem in Bezug auf den aktuellen Betrieb der CPU. Für die tatsächliche betriebliche Telemetrie würde ich die scaling_*Kernel-Tunables verwenden.

Beispiel

Ich habe das folgende Skript zusammengestellt, um die CPU-Kerne spaltenweise anzuzeigen, damit Sie leichter sehen können, wie die verschiedenen Kernel-Tunables aussehen:

#!/bin/bash

nthCore=$(lscpu|grep node0|cut -d"-" -f2)

for i in /sys/devices/system/cpu/cpu0/cpufreq/{cpuinfo,scaling}_*; do
  pname=$(basename $i)
  [[ "$pname" == *available* ]] || [[ "$pname" == *transition* ]] || \
  [[ "$pname" == *driver* ]]    || [[ "$pname" == *setspeed* ]] && continue
  echo "$pname: "
  for j in `seq 0 $nthCore`;do
    kparam=$(echo $i | sed "s/cpu0/cpu$j/")
    sudo cat $kparam
  done
done | paste - - - - - | column -t

Wenn Sie es ausführen, erhalten Sie die folgende Ausgabe:

$ ./cpuinfo.bash
cpuinfo_cur_freq:  2667000   2667000   2667000   2667000
cpuinfo_max_freq:  2667000   2667000   2667000   2667000
cpuinfo_min_freq:  1199000   1199000   1199000   1199000
scaling_cur_freq:  2667000   2266000   1333000   2667000
scaling_governor:  ondemand  ondemand  ondemand  ondemand
scaling_max_freq:  2667000   2667000   2667000   2667000
scaling_min_freq:  1199000   1199000   1199000   1199000

Sie können sehen, dass das scaling_cur_freqTunable eine Verlangsamung in Kern Nr. 1 und 2 zeigt.

slm
quelle
Wenn das wahr wäre, würden Sie nicht /proc/cpuinfodasselbe melden wie cpuinfo_cur_freq? Das tut es eindeutig nicht! Das Herz meiner Frage bleibt immer noch ungelöst. Ich habe dieses Tool entdeckt , das irgendwie "wahre Häufigkeit" zu melden scheint, bin mir aber nicht sicher, ob es richtig funktioniert. Es bietet einige Quellen für seinen Algorithmus, liefert jedoch keine wirklich gute Erklärung für die Diskrepanz.
Wulftone
Die Zeilen wie /sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_cur_freqzeigen die Höchstgeschwindigkeiten an, obwohl der Name die aktuelle Geschwindigkeit implizieren würde. Dies ist die Unterbrechung, nach der Sie fragen, oder? Mein System zeigt sie auch so.
slm
Wenn Sie die Frequenzskalierung /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
aktiviert
2
Hinweis: Seit Kernel 4.13 wird cat /proc/cpuinfo | grep MHzdie aktuelle Taktrate nicht mehr zurückgegeben . Im Kernel Bugzilla heißt es, es sei beabsichtigt. Siehe bugzilla.kernel.org/show_bug.cgi?id=197009 . Es wird auch hier erwähnt: phoronix.com/…
Marc.2377
1
... zurückgekehrt in Linux 4.14.rc8 .
März 2377