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

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

当我做

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。

有人知道发生了什么事吗?

答案1

大多数 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

更多详细信息可参见这篇文章,标题为:Linux 中使用 cpufreq 调整 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 的速度减慢。

相关内容