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

10

Quando faço

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

Eu recebo 1,8 - 2,7 GHz. Nunca vai acima de 2,7.

E quando eu faço

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

Eu recebo 768 MHz - 1,8 GHz. Nunca vai acima de 1,8.

Alguém sabe o que está acontecendo?

    
por wulftone 20.08.2013 / 23:51

1 resposta

12

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

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

A velocidade absoluta (máx.) da CPU está sendo relatada por isso:

$ cat /proc/cpuinfo

Especificamente, esta linha:

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

A linha que mostra cpu MHz não mostra a velocidade máxima da sua CPU. Este valor é a sua velocidade atual. Em um sistema multi-core, 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

Você pode, no entanto, ver a velocidade absoluta (máx.) 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.

Escalonamento da CPU & governando?

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 deles está ativo no momento:

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

OBSERVAÇÃO: Os comandos que estou mostrando incluem apenas o primeiro cpu, cpu0 . Você pode substituir em * no caminho para ver todos os núcleos ou você pode ver seletivamente cpu1 , etc.

Você pode ver o máximo & Velocidades mínimas de 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: escala de frequência da CPU no Linux com cpufreq .

Então e cpuinfo_cur_freq?

Este parâmetro tem mais a ver com a especificação da CPU e em qual perfil ela está atualmente, em vez de qualquer coisa útil em relação a como a CPU está operando atualmente. Para telemetria operacional real, usaria os sintetizadores do kernel scaling_* .

Exemplo

Eu coloquei o seguinte script em conjunto para mostrar os Núcleos da CPU em coluna para que fosse mais fácil ver como eram os vários ajustáveis 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

Quando você o executa, 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_freq ajustável está mostrando uma lentidão no núcleo # 1 & 2.

    
por 21.08.2013 / 02:10