Зараз у більшості процесорів є можливість регулювати їх швидкість, щоб заощадити на використанні акумулятора / енергії. Зазвичай це називається масштабуванням частоти процесора . Про швидкість роботи в режимі реального часу повідомляється так:
$ sudo cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
Абсолютна (макс.) Швидкість процесора повідомляється цим:
$ cat /proc/cpuinfo
Конкретно цей рядок:
model name : Intel(R) Core(TM) i5 CPU M 560 @ 2.67GHz
У рядку, який відображається cpu MHz
, не відображається максимальна швидкість вашого процесора. Це значення - ваша поточна швидкість. У багатоядерній системі, такі як i7 або i5, ви можете бачити це за допомогою цієї команди:
$ cat /proc/cpuinfo |grep MHz
cpu MHz : 1199.000
cpu MHz : 1199.000
cpu MHz : 1199.000
cpu MHz : 2667.000
Однак ви можете бачити абсолютну (максимальну) швидкість за допомогою цієї команди:
$ 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
ПРИМІТКА: кількість ядер, які він має, NUMAS node0 CPU(s)
дорівнює 4, тобто 0,1,2 та 3.
Масштабування та керування процесором?
Режим, у якому працює ваша система, називається регулятором масштабування. Схожий на губернатора на машині. Ви можете побачити, які з цих команд доступні:
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
powersave ondemand userspace performance
Ви також можете побачити, який з них зараз активний:
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
ondemand
Примітка: Команди я показую включають тільки 1 - й центральний процесор, cpu0
. Ви можете або замінити в a *
на шляху, щоб побачити всі ядра, або ви можете вибірково бачити cpu1
і т.д.
Ви можете бачити максимальні та мінімальні швидкості процесора, доступні для профілю вашого губернатора:
$ sudo cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq
2667000
$ sudo cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq
1199000
Більш детальна інформація доступна в цій статті під назвою: Масштабування частоти процесора в Linux за допомогою cpufreq .
То що робити з cpuinfo_cur_freq?
Цей параметр більше пов'язаний із специфікацією процесора та тим, у якому профілі він зараз перебуває, а не з корисним щодо того, як ЦП працює в даний час. Для фактичної оперативної телеметрії я б використовував scaling_*
перемикання ядра.
Приклад
Я складаю наступний сценарій разом, щоб показати CPU Cores в порядку стовпців, щоб було легше зрозуміти, як виглядають різні перетворення ядра:
#!/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
Запустивши його, ви отримаєте такий результат:
$ ./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
Ви можете бачити, що налаштування scaling_cur_freq
показує уповільнення ядра №1 та 2.
/proc/cpuinfo
повідомили б те саме, щоcpuinfo_cur_freq
? Це явно ні! Серце мого питання досі залишається невирішеним. Я виявив цей інструмент, який, здається, якось повідомляє про "справжню частоту", але я не впевнений, що він працює правильно. Він надає деякі джерела для свого алгоритму, але насправді не дає великого пояснення розбіжності.