Perché cpuinfo_cur_freq e / proc / cpuinfo riportano numeri diversi?


13

Quando io faccio

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

Ottengo 1,8 - 2,7 GHz. Non supera mai la 2.7.

E quando lo faccio

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

Ottengo 768 MHz - 1,8 GHz. Non va mai oltre 1,8.

Qualcuno sa cosa sta succedendo?

Risposte:


14

La maggior parte delle CPU ora include la possibilità di regolare la loro velocità per aiutare a risparmiare sull'utilizzo della batteria / energia. In genere si chiama ridimensionamento della frequenza della CPU . La velocità in tempo reale della CPU è indicata da questo:

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

La velocità assoluta (massima) della CPU è riportata da questo:

$ cat /proc/cpuinfo

Nello specifico questa linea:

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

La linea che mostra cpu MHz non mostra la velocità massima della tua CPU. Questo valore è la tua velocità attuale. Su un sistema multi-core come i7 o i5 puoi vedere questo con questo comando:

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

Puoi comunque vedere la velocità assoluta (massima) con questo comando:

$ 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

NOTA: il numero di core che ha, NUMAS node0 CPU(s)è 4, cioè 0,1,2 e 3.

Ridimensionamento e governance della CPU?

La modalità in cui si trova il tuo sistema si chiama ridimensionatore. Simile a un governatore su un'auto. Puoi vedere quali sono disponibili con questo comando:

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

Puoi anche vedere quale è attualmente attivo:

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

NOTA: I comandi che sto mostrando solo includono la prima cpu, cpu0. Puoi sostituire in a *nel percorso per vedere tutti i core oppure puoi vedere selettivamente cpu1, ecc.

Puoi vedere la velocità massima e minima della CPU disponibile per il profilo del tuo governatore:

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

Maggiori dettagli sono disponibili in questo articolo, intitolato: Ridimensionamento della frequenza della CPU in Linux con cpufreq .

E che dire di cpuinfo_cur_freq?

Questo parametro ha più a che fare con le specifiche della CPU e il profilo in cui si trova attualmente, piuttosto che con qualsiasi cosa utile rispetto al funzionamento della CPU. Per la telemetria operativa effettiva userei i scaling_*parametri sintonizzabili del kernel.

Esempio

Ho messo insieme il seguente script per mostrare i core della CPU in termini di colonna, quindi sarebbe più facile vedere come apparivano i vari parametri sintonizzabili del kernel:

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

Quando lo esegui ottieni il seguente output:

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

Puoi vedere che il scaling_cur_freqparametro sintonizzabile sta mostrando un rallentamento nel core # 1 e 2.


Se ciò fosse vero, non /proc/cpuinfosegnalerebbe lo stesso di cpuinfo_cur_freq? Chiaramente no! Il cuore della mia domanda rimane ancora irrisolto. Ho scoperto questo strumento che sembra riportare in qualche modo "la vera frequenza", ma non sono sicuro che funzioni correttamente. Fornisce alcune fonti per il suo algoritmo, ma in realtà non fornisce una grande spiegazione per la discrepanza.
wulftone,

Le linee come /sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_cur_freqstanno mostrando le velocità massime, anche se il loro nome implicherebbe la velocità attuale, questa è la disconnessione di cui stai chiedendo, giusto? Il mio sistema li mostra anche in questo modo.
slm

Quando hai attivato il ridimensionamento di frequenza, dovresti utilizzarlo per ottenere le frequenze effettive della cpu:/sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
slm

2
Nota: dal kernel 4.13, cat /proc/cpuinfo | grep MHznon restituisce più la velocità di clock corrente . Al Kernel Bugzilla, dicono che è intenzionale. Vedi bugzilla.kernel.org/show_bug.cgi?id=197009 . È anche menzionato qui: phoronix.com/…
Marc.2377

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.