web-dev-qa-db-ja.com

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

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

13
wulftone

ほとんどの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_のみが含まれています。パスの_*_を代入してすべてのコアを表示するか、または_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でのCPU周波数スケーリングとcpufreq を参照してください。

では、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のスローダウンを示していることがわかります。

14
slm