muito tempo gasto em intel_idle

5

No momento da escrita deste artigo, htop mostra dois núcleos em cerca de 50% cada em threads do kernel (barras vermelhas). De botas anteriores eu sei que isso aumentará para 3 e até 4 núcleos a 50% cada ao longo do tempo. Nenhum tópico que o htop mostra tem algum uso de CPU acima de 1%. Isso é meio estranho, não é?

Eu tentei investigar mais e usando perf record -a como root eu descobri que 11.3% de todas as amostras estavam em um thread do kernel do comando swapper na função intel_idle .

Assumirei que este comando swapper corresponde à estranha ocupação da cpu que vejo no htop, mas alguém pode me explicar algumas das seguintes questões:

  • o que causou isso? É um bug ou algo com minhas configurações?
  • isso afeta o desempenho geral do meu sistema?
  • como posso me livrar disso?

mais alguns detalhes sobre o meu sistema:

$ uname -a
Linux [...] 4.8.0-0.rc2.git2.2.fc26.x86_64 #1 SMP Wed Aug 17 22:16:04 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 94
Model name:            Intel(R) Core(TM) i7-6700K CPU @ 4.00GHz
Stepping:              3
CPU MHz:               799.804
CPU max MHz:           4200.0000
CPU min MHz:           800.0000
BogoMIPS:              8016.00
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              8192K
NUMA node0 CPU(s):     0-7
Flags:                 [...]

update: Sob carga, o comportamento é um pouco diferente. (observe primeiro que agora estou em três núcleos a 50% cada e o perf relatará 27% dentro de intel_idle ) Eu coloquei meu cpu sob estresse com sysbench --test=cpu --num-threads=8 --max-requests=1000000 run e verifiquei htop e perf novamente. O Htop relatou 3 núcleos a 100% no kernel (os mesmos núcleos que mostram 50% durante o tempo ocioso) e 5 a 100% da população do usuário. Perf relatou que o sysbench ocupava 85% da minha cpu e não explica os 15% restantes ... Não tenho certeza do que isso significa. A minha CPU foi efetivamente reduzida para 85% de desempenho?

    
por example 23.08.2016 / 22:05

1 resposta

1

Esta resposta é principalmente especulativa, porque eu não sei nada sobre gerenciamento de energia em processadores Intel e não olhei para o código Linux, mas acho que é plausível.

Eu acho que explicação do derobert sobre gerenciamento de energia é o que está acontecendo. O gerenciamento de energia é um compromisso entre consumo de energia e desempenho. Quando o processador não está sendo usado em 100% de seu desempenho de pico, é benéfico reduzir sua frequência, o que o torna mais lento, porém mais frio.

O Linux varia a frequência da CPU ao longo do tempo. Como isso é controlado por políticas chamadas governors . A idéia geral é que, quando o sistema não usa a CPU durante todo o tempo, reduz a freqüência da CPU. Por outro lado, se a CPU estiver continuamente ocupada por um tempo, o kernel aumenta a frequência.

Ver intel_idle agendado significa que o núcleo não está executando código, mas na verdade em um modo "suspenso", onde consome pouca energia. Isso traz uma economia de energia maior do que simplesmente reduzir a frequência, mas a um custo maior: embora a CPU reative quando uma interrupção ocorre, isso leva algum tempo (dezenas de microssegundos? mais?).

É perfeitamente normal ver intel_idle quando você não está utilizando todos os seus núcleos. Isso economiza muita energia (tanto para o processador em si quanto para os dispositivos de resfriamento), em comparação com ter a CPU a toda velocidade o tempo todo. A única razão pela qual você pode ter que desabilitar esse mecanismo é se você precisa de uma latência muito baixa . Se você executar um aplicativo com uso intenso da CPU, verá menos e menos intel_idle . Utilizar o modo ocioso da CPU não custa desempenho, exceto durante o período de transição, onde o kernel ainda não decidiu totalmente que o sistema precisa de muita energia da CPU.

Se você saturar totalmente seus núcleos, você alcançará 0% intel_idle . Note que pode ser difícil saturar todos os núcleos (embora um benchmark especialmente projetado possa fazê-lo) já que todo o código e dados que estão sendo executados não cabem no cache da CPU, o fator limitante será a velocidade de acesso da RAM . "Todo o código e dados" inclui tudo o que está sendo executado na máquina, incluindo sua interface de usuário; na prática, saturar todos os núcleos é raro.

    
por 24.08.2016 / 01:29