Pourquoi cpuinfo_cur_freq et / proc / cpuinfo signalent des nombres différents?

13

Quand je fais

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

J'obtiens 1,8 - 2,7 GHz. Il ne dépasse jamais 2,7.

Et quand je fais

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

J'obtiens 768 MHz - 1,8 GHz. Il ne dépasse jamais 1,8.

Quelqu'un sait ce qu'il se passe?

wulftone
la source

Réponses:

14

La plupart des processeurs incluent désormais la possibilité d'ajuster leur vitesse pour aider à économiser sur la batterie / consommation d'énergie. Il est généralement appelé mise à l'échelle de la fréquence du processeur . La vitesse en temps réel du CPU est signalée par ceci:

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

La vitesse absolue (max) du processeur est signalée par ceci:

$ cat /proc/cpuinfo

Plus précisément cette ligne:

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

La ligne qui s'affiche cpu MHz ne montre pas la vitesse maximale de votre CPU. Cette valeur est votre vitesse actuelle. Sur un système multicœur tel qu'un i7 ou i5, vous pouvez le voir avec cette commande:

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

Vous pouvez cependant voir la vitesse absolue (max) avec cette commande:

$ 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

REMARQUE: le nombre de cœurs qu'il possède NUMAS node0 CPU(s)est de 4, soit 0,1,2 et 3.

Mise à l'échelle et gouvernance du processeur?

Le mode dans lequel se trouve votre système s'appelle le gouverneur de mise à l'échelle. Semblable à un gouverneur sur une voiture. Vous pouvez voir lesquels sont disponibles avec cette commande:

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

Vous pouvez également voir lequel est actuellement actif:

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

REMARQUE: Les commandes je montre seulement inclure le 1er cpu, cpu0. Vous pouvez soit remplacer un *dans le chemin pour voir tous les cœurs, soit vous pouvez le voir de manière sélective cpu1, etc.

Vous pouvez voir les vitesses CPU maximales et minimales disponibles pour le profil de votre gouverneur:

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

Plus de détails sont disponibles dans cet article, intitulé: Mise à l'échelle de la fréquence du processeur sous Linux avec cpufreq .

Qu'en est-il de cpuinfo_cur_freq?

Ce paramètre a plus à voir avec la spécification du CPU et le profil dans lequel il se trouve actuellement, plutôt qu'avec quelque chose d'utile en ce qui concerne le fonctionnement actuel du CPU. Pour la télémétrie opérationnelle réelle, j'utiliserais les scaling_*réglages du noyau.

Exemple

J'ai rassemblé le script suivant pour afficher les cœurs de CPU par colonne afin qu'il soit plus facile de voir à quoi ressemblaient les divers paramètres ajustables du noyau:

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

Lorsque vous l'exécutez, vous obtenez la sortie suivante:

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

Vous pouvez voir que le scaling_cur_freqréglage montre un ralentissement dans les cœurs # 1 et 2.

slm
la source
Si c'était vrai, ne /proc/cpuinforapporterait-il pas le même que cpuinfo_cur_freq? Ce n'est clairement pas le cas! Le cœur de ma question n'est toujours pas résolu. J'ai découvert cet outil qui semble signaler en quelque sorte la "vraie fréquence", mais je ne suis pas sûr qu'il fonctionne correctement. Il fournit quelques sources pour son algorithme, mais ne fournit pas vraiment une excellente explication de l'écart.
wulftone
Les lignes telles que /sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_cur_freqmontrent les vitesses maximales, même si leur nom impliquerait la vitesse actuelle, c'est la déconnexion que vous demandez, non? Mon système les montre également de cette façon.
slm
Lorsque la mise à l'échelle des fréquences est activée, vous devez l'utiliser pour obtenir les fréquences réelles du processeur:/sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
slm
2
Remarque: depuis le noyau 4.13, cat /proc/cpuinfo | grep MHzne renvoie plus la vitesse d'horloge actuelle . Au Kernel Bugzilla, ils disent que c'est intentionnel. Voir bugzilla.kernel.org/show_bug.cgi?id=197009 . Il est également mentionné ici: phoronix.com/…
Marc.2377
1
... Reconvertit dans Linux 4.14.rc8 .
Marc.2377