Dlaczego cpuinfo_cur_freq i / proc / cpuinfo zgłaszają różne liczby?


13

Kiedy robię

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

Dostaję 1,8 - 2,7 GHz. Nigdy nie przekracza 2,7.

A kiedy to zrobię

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

Dostaję 768 MHz - 1,8 GHz. Nigdy nie przekracza 1,8.

Czy ktoś wie, co się dzieje?

Odpowiedzi:


14

Większość procesorów ma teraz możliwość dostosowania ich prędkości, aby pomóc w oszczędzaniu baterii / zużycia energii. Zwykle nazywa się to skalowaniem częstotliwości procesora . Szybkość procesora w czasie rzeczywistym jest zgłaszana przez:

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

Zgłaszana jest tutaj bezwzględna (maksymalna) prędkość procesora:

$ cat /proc/cpuinfo

W szczególności ta linia:

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

Linia, która pokazuje cpu MHz , nie pokazuje maksymalnej prędkości twojego procesora. Ta wartość jest Twoją aktualną prędkością. W systemie wielordzeniowym, takim jak i7 lub i5, możesz to zobaczyć za pomocą tego polecenia:

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

Możesz jednak zobaczyć prędkość bezwzględną (maksymalną) za pomocą tego polecenia:

$ 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

UWAGA: liczba jego rdzeni NUMAS node0 CPU(s)wynosi 4, tj. 0,1,2 i 3.

Skalowanie procesora i zarządzanie?

Tryb, w którym znajduje się system, nazywa się regulatorem skalowania. Podobne do gubernatora w samochodzie. Możesz zobaczyć, które są dostępne za pomocą tego polecenia:

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

Możesz także zobaczyć, który jest obecnie aktywny:

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

UWAGA: Polecenia jestem pokazujące tylko to 1st CPU cpu0. Możesz albo zastąpić w *ścieżce, aby zobaczyć wszystkie rdzenie, albo selektywnie zobaczyć cpu1, itp.

Możesz zobaczyć maksymalne i minimalne prędkości procesora dostępne dla profilu swojego gubernatora:

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

Więcej szczegółów dostępnych jest w tym artykule, zatytułowanym: Skalowanie częstotliwości procesora w systemie Linux za pomocą cpufreq .

A co z cpuinfo_cur_freq?

Ten parametr ma więcej wspólnego ze specyfikacją procesora i profilem, w którym aktualnie się znajduje, a nie z czymkolwiek przydatnym w odniesieniu do tego, jak procesor aktualnie działa. Do rzeczywistej telemetrii scaling_*operacyjnej użyłbym tunerów jądra.

Przykład

Złożyłem następujący skrypt razem, aby pokazać rdzenie procesorów w kolumnach, aby łatwiej było zobaczyć, jak wyglądały różne tunery jądra:

#!/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

Po uruchomieniu otrzymasz następujące dane wyjściowe:

$ ./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

Widać, że scaling_cur_freqprzestrajanie wykazuje spowolnienie w rdzeniu 1 i 2.


Gdyby to była prawda, czy nie /proc/cpuinfozgłosiłby tego samego cpuinfo_cur_freq? Oczywiście, że nie! Serce mojego pytania wciąż pozostaje nierozwiązane. Odkryłem to narzędzie, które wydaje się w jakiś sposób zgłaszać „prawdziwą częstotliwość”, ale nie jestem pewien, czy działa poprawnie. Zapewnia pewne źródła dla swojego algorytmu, ale tak naprawdę nie stanowi dobrego wyjaśnienia rozbieżności.
wulftone

Linie takie jak /sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_cur_freqpokazują maksymalne prędkości, nawet jeśli ich nazwa sugeruje aktualną prędkość, to o to rozłączenie pytasz, prawda? Mój system pokazuje je również w ten sposób.
slm

Kiedy masz włączone skalowanie częstotliwości, powinieneś użyć tego, aby uzyskać rzeczywiste częstotliwości procesora:/sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
slm

2
Uwaga: Od jądra 4.13 cat /proc/cpuinfo | grep MHznie zwraca już bieżącej częstotliwości zegara . W Bugzilli jądra mówią, że jest to celowe. Zobacz bugzilla.kernel.org/show_bug.cgi?id=197009 . Wspomniano także tutaj: phoronix.com/…
Marc.2377,

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.