Mengapa cpuinfo_cur_freq dan / proc / cpuinfo melaporkan nomor yang berbeda?

13

Kapan saya melakukannya

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

Saya mendapatkan 1,8 - 2,7 GHz. Tidak pernah melampaui 2.7.

Dan ketika saya melakukannya

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

Saya mendapatkan 768 MHz - 1,8 GHz. Tidak pernah melampaui 1,8.

Ada yang tahu apa yang sedang terjadi?

wulftone
sumber

Jawaban:

14

Sebagian besar CPU sekarang termasuk kemampuan untuk menyesuaikan kecepatan mereka untuk membantu menghemat penggunaan baterai / daya. Biasanya disebut skala frekuensi CPU . Kecepatan realtime CPU dilaporkan oleh ini:

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

Kecepatan absolut (maks) CPU dilaporkan oleh ini:

$ cat /proc/cpuinfo

Secara khusus baris ini:

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

Garis yang ditampilkan cpu MHz tidak menunjukkan kecepatan maksimum CPU Anda. Nilai ini adalah kecepatan Anda saat ini. Pada sistem multi-core seperti i7 atau i5 Anda dapat melihat ini dengan perintah ini:

$ cat /proc/cpuinfo |grep MHz
cpu MHz     : 1199.000
cpu MHz     : 1199.000
cpu MHz     : 1199.000
cpu MHz     : 2667.000

Namun Anda dapat melihat kecepatan absolut (maks) dengan perintah ini:

$ 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

CATATAN: jumlah inti yang dimilikinya, NUMAS node0 CPU(s)adalah 4, yaitu 0,1,2, dan 3.

Penskalaan & pengaturan CPU?

Mode sistem Anda berada disebut gubernur penskalaan. Mirip dengan gubernur di mobil. Anda dapat melihat mana yang tersedia dengan perintah ini:

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

Anda juga dapat melihat mana yang sedang aktif:

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

CATATAN: Perintah yang saya tampilkan hanya mencakup cpu 1 cpu0,. Anda dapat mengganti dalam *di jalur untuk melihat semua inti atau Anda dapat melihat secara selektif cpu1, dll.

Anda dapat melihat kecepatan CPU maksimum & minimum yang tersedia untuk profil gubernur Anda:

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

Rincian lebih lanjut tersedia dalam artikel ini, berjudul: penskalaan frekuensi CPU di Linux dengan cpufreq .

Jadi bagaimana dengan cpuinfo_cur_freq?

Parameter ini lebih berkaitan dengan spesifikasi CPU dan profil mana yang saat ini digunakan, daripada apa pun yang bermanfaat sehubungan dengan bagaimana CPU saat ini beroperasi. Untuk telemetri operasional yang sebenarnya saya akan menggunakan scaling_*tunables kernel.

Contoh

Saya menyatukan skrip berikut untuk menampilkan kolom CPU Cores sehingga akan lebih mudah untuk melihat seperti apa berbagai tunable Kernel terlihat:

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

Ketika Anda menjalankannya, Anda mendapatkan output berikut:

$ ./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

Anda dapat melihat bahwa scaling_cur_freqmerdu menunjukkan perlambatan pada core # 1 & 2.

slm
sumber
Jika itu benar, bukankah akan /proc/cpuinfomelaporkan hal yang sama cpuinfo_cur_freq? Jelas tidak! Inti dari pertanyaan saya masih belum terpecahkan. Saya menemukan alat ini yang entah bagaimana melaporkan "frekuensi sebenarnya", tetapi saya tidak yakin itu berfungsi dengan benar. Ini menyediakan beberapa sumber untuk algoritmanya, tetapi tidak benar-benar memberikan penjelasan yang bagus untuk perbedaan tersebut.
wulftone
Garis-garis seperti /sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_cur_freqmenunjukkan kecepatan maksimum, meskipun namanya menyiratkan kecepatan saat ini, ini adalah putuskan yang Anda tanyakan, kan? Sistem saya juga menunjukkan kepada mereka cara ini.
slm
Ketika Anda mengaktifkan penskalaan frekuensi, Anda harus menggunakan ini untuk mendapatkan frekuensi cpu yang sebenarnya:/sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
slm
2
Catatan: Karena Kernel 4.13, cat /proc/cpuinfo | grep MHztidak lagi mengembalikan kecepatan jam saat ini . Di Kernel Bugzilla, mereka mengatakan itu disengaja. Lihat bugzilla.kernel.org/show_bug.cgi?id=197009 . Itu juga disebutkan di sini: phoronix.com/…
Marc.2377
1
... Dikembalikan di Linux 4.14.rc8 .
Marc.2377