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を超えることはありません。

誰が何が起こっているのか知っていますか?

回答:


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 2013

などの線/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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.