Почему 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.

Кто-нибудь знает, что происходит?

wulftone
источник

Ответы:

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. Вы можете либо заменить *путь, чтобы увидеть все ядра, либо выборочно увидеть 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_*настройки ядра.

пример

Я соединил следующий сценарий, чтобы показать столбцы ЦП по столбцам, чтобы было легче увидеть, как выглядят различные настраиваемые ядра:

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

SLM
источник
Если бы это было правдой, не /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
Примечание: начиная с ядра 4.13, cat /proc/cpuinfo | grep MHzбольше не возвращает текущую тактовую частоту . В Kernel Bugzilla говорят, что это намеренно. См. Bugzilla.kernel.org/show_bug.cgi?id=197009 . Это также упомянуто здесь: phoronix.com/…
Marc.2377
1
... Отменено в Linux 4.14.rc8 .
23 марта 17