Por que cpuinfo_cur_freq e / proc / cpuinfo relatam números diferentes?

13

Quando eu faço

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

Recebo 1,8 - 2,7 GHz. Nunca ultrapassa 2,7.

E quando eu faço

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

Recebo 768 MHz - 1,8 GHz. Nunca ultrapassa 1,8.

Alguém sabe o que está acontecendo?

wulftone
fonte

Respostas:

14

A maioria das CPUs agora inclui a capacidade de ajustar sua velocidade para ajudar a economizar no uso de bateria / energia. É normalmente chamado de escala de frequência da CPU . A velocidade em tempo real da CPU é relatada por este:

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

A velocidade absoluta (máxima) da CPU está sendo relatada por este:

$ cat /proc/cpuinfo

Especificamente esta linha:

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

A linha exibida cpu MHz não mostra a velocidade máxima da sua CPU. Este valor é a sua velocidade atual. Em um sistema com vários núcleos, como um i7 ou i5, você pode ver isso com este comando:

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

No entanto, você pode ver a velocidade absoluta (máxima) com este 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: o número de núcleos que possui NUMAS node0 CPU(s)é 4, ou seja, 0,1,2 e 3.

Dimensionamento e administração da CPU?

O modo em que seu sistema está é chamado de regulador de escala. Semelhante a um governador em um carro. Você pode ver quais estão disponíveis com este comando:

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

Você também pode ver qual está ativo no momento:

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

NOTA: Os comandos que estou mostrando incluem apenas o 1º processador cpu0,. Você pode substituir em um *no caminho para ver todos os núcleos ou pode ver seletivamente cpu1etc.

Você pode ver as velocidades máxima e mínima da CPU disponíveis para o perfil do seu governador:

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

Mais detalhes estão disponíveis neste artigo, intitulado: Escalonamento de frequência da CPU no Linux com cpufreq .

Então, e o cpuinfo_cur_freq?

Esse parâmetro tem mais a ver com a especificação da CPU e em qual perfil ele está atualmente, em vez de algo útil em relação à forma como a CPU está operando no momento. Para telemetria operacional real, eu usaria os scaling_*ajustáveis do kernel.

Exemplo

Coloquei o seguinte script para mostrar os núcleos da CPU em colunas, para que fosse mais fácil ver como eram os vários ajustes do 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

Ao executá-lo, você obtém a seguinte saída:

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

Você pode ver que o scaling_cur_freqajuste está mostrando uma desaceleração nos núcleos 1 e 2.

slm
fonte
Se isso fosse verdade, não /proc/cpuinforeportaria o mesmo que cpuinfo_cur_freq? Claramente não! O cerne da minha pergunta ainda permanece sem solução. Descobri essa ferramenta que parece relatar "frequência verdadeira", mas não tenho certeza se funciona corretamente. Ele fornece algumas fontes para seu algoritmo, mas realmente não fornece uma ótima explicação para a discrepância.
Wulftone 23/08
As linhas como as que /sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_cur_freqmostram as velocidades máximas, mesmo que o nome implique na velocidade atual, essa é a desconexão que você está perguntando, certo? Meu sistema também mostra dessa maneira.
slm
Quando o escalonamento de frequência está ativado, você deve usá-lo para obter as frequências reais da CPU:/sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
slm
2
Nota: Desde o Kernel 4.13, cat /proc/cpuinfo | grep MHznão retorna mais a velocidade atual do relógio . No Bugzilla do Kernel, eles dizem que é intencional. Veja bugzilla.kernel.org/show_bug.cgi?id=197009 . Também é mencionado aqui: phoronix.com/…
Marc.2377 11/11
1
... Revertido no Linux 4.14.rc8 .
Marc.2377