Leva tempo para o processo utilizar a CPU?

1

Eu tenho uma máquina x86 single-core onde executo o burnP6 (do pacote cpuburn) por 1 segundo e depois mato o programa:

while true; do /usr/bin/burnP6 & sleep 1; pkill burnP6; sleep 1; done

Se eu verificar a utilização da CPU com top -d 1 , a carga do processo burnP6 será geralmente menor que 50%. Se eu executar o comando while true; do ps -e -o cmd,pcpu | grep burnP6; done , a carga da CPU tem as seguintes características:

/usr/bin/burnP6              0.0
/usr/bin/burnP6              9.0
/usr/bin/burnP6             10.0
/usr/bin/burnP6             10.0
/usr/bin/burnP6             11.0
/usr/bin/burnP6             11.0
/usr/bin/burnP6             12.0
/usr/bin/burnP6             12.0
/usr/bin/burnP6             13.0
/usr/bin/burnP6             14.0
/usr/bin/burnP6             15.0
/usr/bin/burnP6             15.0
/usr/bin/burnP6             16.0
/usr/bin/burnP6             16.0
/usr/bin/burnP6             17.0
/usr/bin/burnP6             18.0
/usr/bin/burnP6             18.0
/usr/bin/burnP6             19.0
/usr/bin/burnP6             20.0
/usr/bin/burnP6             20.0
/usr/bin/burnP6             21.0
/usr/bin/burnP6             22.0
/usr/bin/burnP6             22.0
/usr/bin/burnP6             23.0
/usr/bin/burnP6             24.0
/usr/bin/burnP6             24.0
/usr/bin/burnP6             25.0
/usr/bin/burnP6             25.0
/usr/bin/burnP6             26.0
/usr/bin/burnP6             27.0
/usr/bin/burnP6             28.0
/usr/bin/burnP6             28.0
/usr/bin/burnP6             28.0
/usr/bin/burnP6             30.0
/usr/bin/burnP6             30.0
/usr/bin/burnP6             31.0
/usr/bin/burnP6             31.0
/usr/bin/burnP6             32.0
/usr/bin/burnP6             32.0
/usr/bin/burnP6             33.0
/usr/bin/burnP6             33.0
/usr/bin/burnP6             35.0
/usr/bin/burnP6             35.0
/usr/bin/burnP6             36.0
/usr/bin/burnP6             36.0
/usr/bin/burnP6             37.0
/usr/bin/burnP6             38.0
/usr/bin/burnP6             38.0
/usr/bin/burnP6             39.0
/usr/bin/burnP6             40.0
/usr/bin/burnP6             40.0
/usr/bin/burnP6             41.0
/usr/bin/burnP6             42.0
/usr/bin/burnP6             42.0
/usr/bin/burnP6             43.0
/usr/bin/burnP6             44.0
/usr/bin/burnP6             44.0
/usr/bin/burnP6             45.0
/usr/bin/burnP6             45.0
/usr/bin/burnP6             46.0
/usr/bin/burnP6             46.0
/usr/bin/burnP6             47.0
/usr/bin/burnP6             48.0
/usr/bin/burnP6             48.0
/usr/bin/burnP6             49.0
/usr/bin/burnP6             50.0
/usr/bin/burnP6             50.0
/usr/bin/burnP6             51.0
/usr/bin/burnP6             52.0
/usr/bin/burnP6             52.0
/usr/bin/burnP6             53.0
/usr/bin/burnP6              0.0

Como visto acima, a carga irá rapidamente de 0% para 53%, mas então o processo burnP6 é eliminado, ou seja, ele é executado por tempo muito curto para atingir 99% - 100% de utilização. Esses resultados são causados pelo método de medição e, na verdade, o processo burnP6 utiliza CPU 100% desde o primeiro microssegundo? :) Ou será que o processo leva de 1 a 2 segundos para obter todo o tempo da CPU?

    
por Martin 18.11.2014 / 09:44

1 resposta

2

O comando que você está usando para exibir a carga da CPU está sendo executado em um loop apertado, por isso está competindo com CPUburn. Se você quiser observar a carga da CPU que a CPU teria sem concorrência, adicione algo como sleep 1 no loop.

Em seu teste, inicialmente o loop de observador fica com praticamente todo o CPU, então progressivamente o burnP6 ganha mais e mais compartilhamento de CPU. Essa é uma consequência da política de agendamento do Linux. O kernel do Linux tem um agendador complexo - na verdade, ele tem muitos algoritmos de agendamento e você pode configurar qual (is) usar no tempo de execução. Leia a página man do sched (7) para uma introdução, e a documentação do kernel e a livro de referência, se você quiser entrar em mais detalhes.

Uma pessoa mais experiente do que eu poderia dizer por esta saída qual agendador está ativo em seu sistema. Eu não posso. Eu posso ver que ele privilegia os programas de E / S (o ps | grep loop, que praticamente não faz nada além de carregar executáveis, criar processos e passar dados) em detrimento dos altos consumidores de CPU. Isso faz sentido em muitas situações: o programa intensivo de CPU provavelmente não se importa em gastar 1.1s em vez de 1s em um cálculo, enquanto o programa intensivo de E / S é geralmente um thread de interface de usuário ou um serviço de rede para o qual uma resposta rápida tempo (baixa latência) é apreciado. Existe aparentemente algum tipo de medida de justiça que então empurra a balança para longe do grupo de processos que está monopolizando toda a CPU.

Seria instrutivo brincar com as configurações em /proc/sys/kernel/sched* e ver como o comportamento varia.

    
por 20.11.2014 / 03:28