Чому cpuinfo_cur_freq та / proc / cpuinfo повідомляють про різні числа?


13

Коли я це роблю

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

Я отримую 1,8 - 2,7 ГГц. Він ніколи не перевищує 2,7.

А коли я це роблю

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

Я отримую 768 МГц - 1,8 ГГц. Це ніколи не перевищує 1,8.

Хтось знає, що відбувається?

Відповіді:


14

Зараз у більшості процесорів є можливість регулювати їх швидкість, щоб заощадити на використанні акумулятора / енергії. Зазвичай це називається масштабуванням частоти процесора . Про швидкість роботи в режимі реального часу повідомляється так:

$ 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? Це явно ні! Серце мого питання досі залишається невирішеним. Я виявив цей інструмент, який, здається, якось повідомляє про "справжню частоту", але я не впевнений, що він працює правильно. Він надає деякі джерела для свого алгоритму, але насправді не дає великого пояснення розбіжності.
wulftone

Такі лінії, як, наприклад /sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_cur_freq, показують максимальну швидкість, навіть якщо їхнє ім'я означатиме поточну швидкість, це питання про відключення, про яке ви питаєте, правда? Моя система показує їх і таким чином.
slm

Якщо увімкнено масштабування частоти, ви повинні використовувати це для отримання фактичних частот процесора:/sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
slm

2
Примітка. Оскільки Kernel 4.13, cat /proc/cpuinfo | grep MHzбільше не повертає поточну тактову частоту . У Кернелі Bugzilla кажуть, що це навмисно. Див. Bugzilla.kernel.org/show_bug.cgi?id=197009 . Тут також згадується: phoronix.com/…
Marc.2377

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.