Cpu-Frequency

為什麼 cpuinfo_cur_freq 和 /proc/cpuinfo 報告不同的數字?

  • March 17, 2021

當我做

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。

有誰知道發生了什麼?

大多數 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 中顯示出減速。

引用自:https://unix.stackexchange.com/questions/87522