Por que o tempo de 'usuário' e 'sys varia em várias execuções?

3

Há uma boa pergunta e resposta explicando as relações entre 'real', 'usuário' e 'sys '.

Explica as razões pelas quais o 'real' pode variar e define o 'usuário' e 'sys' como vezes que o processo realmente passou rodando no processador.

Vamos agora ignorar completamente 'real'. Tenho notado que, ao executar o mesmo aplicativo várias vezes, ele fornece diferentes 'sys' e 'user'.

$time dummy_app
user    0m0.032s
sys     0m0.064s

$time dummy_app
user    0m0.020s
sys     0m0.084s

O dummy_app é apenas um loop for que conta de 0 a 100.000.

Qual é a razão pela qual a execução do mesmo binário passaria tempos diferentes no processador? Em outras palavras, por que os 'usuários' e 'sys' não são sempre os mesmos para o mesmo aplicativo?

    
por TheMeaningfulEngineer 14.10.2014 / 22:37

1 resposta

1

Por que os tempos de execução do mesmo binário diferem em várias execuções

O principal problema aqui é o comportamento não-determinístico devido à maneira como a CPU funciona. As CPUs superescalares modernas podem executar várias instruções por vez ou alterar a ordem dos comandos a serem executados (execução fora de ordem). Em relação ao seu exemplo, também é possível que a otimização no uso do cache se aplique. A RAM tem várias magnitudes mais lentas que a própria CPU, e é por isso que o cache intensivo é usado. A segunda execução do seu binário pode ser executada no cache, consumindo, assim, menos ciclos de CPU (ciclos, a CPU teria esperado que os dados fossem recuperados da memória).

Sobre a diferença entre as estatísticas reais, de tempo de processo do usuário e do sistema

Uma dessas coisas não é como a outra. Real refere-se ao tempo decorrido real; Usuário e Sys referem-se ao tempo de CPU usado somente pelo processo.

  • Real é a hora do relógio de parede - o tempo do início ao fim da chamada. Isso é todo o tempo decorrido, incluindo as fatias de tempo usadas por outros processos e o tempo que o processo gasta bloqueado (por exemplo, se estiver aguardando a conclusão da E / S).

  • Usuário é a quantidade de tempo gasto na CPU no código do modo de usuário (fora do kernel) dentro do processo. Este é apenas o tempo real da CPU usado na execução do processo. Outros processos e tempo que o processo gasta bloqueado não contam para essa figura.

  • Sys é a quantidade de tempo de CPU gasto no kernel dentro do processo. Isso significa executar o tempo de CPU gasto em chamadas do sistema dentro do kernel, em oposição ao código da biblioteca, que ainda está em execução no espaço do usuário. Como 'usuário', este é apenas o tempo de CPU usado pelo processo. Veja abaixo uma breve descrição do modo kernel (também conhecido como modo 'supervisor') e o mecanismo de chamada do sistema.

User+Sys informará quanto tempo de CPU real seu processo usou. Observe que isso ocorre em todas as CPUs, portanto, se o processo tiver vários segmentos, ele poderá exceder o tempo de relógio de parede informado por Real . Observe que, na saída, esses números incluem o tempo User e Sys de todos os processos filhos (e seus descendentes), bem como quando poderiam ter sido coletados, por exemplo, por wait(2) ou waitpid(2) , embora as chamadas de sistema subjacentes retornem as estatísticas para o processo e seus filhos separadamente.

Source

    
por 14.10.2014 / 22:41