为什么cpuinfo_cur_freq和/ proc / cpuinfo报告的数字不同?


13

当我做

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

我得到1.8-2.7 GHz。它永远不会超过2.7。

当我这样做

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

我得到768 MHz-1.8 GHz。它永远不会超过1.8。

有人知道发生了什么吗?

Answers:


14

现在,大多数CPU都具有调整速度的功能,以帮助节省电池/电源使用量。通常称为CPU频率缩放。CPU的实时速度通过以下方式报告:

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

通过以下命令报告绝对(最大)CPU速度:

$ cat /proc/cpuinfo

具体来说这行:

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

显示的行cpu MHz 没有显示您的CPU的最大速度。该值是您当前的速度。在多核系统(例如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。

CPU扩展和调节?

系统所处的模式称为缩放调节器。类似于汽车上的调速器。您可以使用以下命令查看哪些可用:

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

您还可以查看当前处于活动状态的一个:

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

注意:我显示的命令仅包括第一个cpu cpu0。您可以替换*路径中的a 以查看所有核心,也可以选择性地查看cpu1,等等。

您可以看到您的州长配置文件可用的最大和最小CPU速度:

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

本文标题为“ 使用cpufreq的Linux中的CPU频率缩放 ”,提供更多详细信息。

那么cpuinfo_cur_freq呢?

此参数与CPU的规格及其当前位于哪个配置文件中有更多关系,而不是与CPU当前的运行方式有关的任何有用信息。对于实际的操作遥测,我将使用scaling_*内核可调参数。

我将以下脚本放在一起以逐栏显示CPU核心数,这样可以更轻松地看到各种内核可调参数的外观:

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

启用频率缩放功能后,您应该使用它来获取实际的CPU频率:/sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
slm

2
注意:从内核4.13开始,cat /proc/cpuinfo | grep MHz不再返回当前时钟速度。在内核Bugzilla,他们说这是故意的。请参阅bugzilla.kernel.org/show_bug.cgi?id=197009。它还这里提到:phoronix.com/...
Marc.2377

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.