Qual das duas metodologias é a correta para obter estatísticas de desempenho em um processo multithread?

Qual das duas metodologias é a correta para obter estatísticas de desempenho em um processo multithread?

Estou investigando o desempenho de um servidor de banco de dados multithread. Existe uma carga de trabalho específica que é executada em aproximadamente 61 segundos em uma máquina específica. O pid do processo de banco de dados era 79894 quando executei perf na carga de trabalho.

Além dos threads de software no servidor de banco de dados, há vários threads relacionados ao Linux, que normalmente ficam inativos em um sistema inativo, que se tornam ativos enquanto minha carga de trabalho está em execução. Portanto, quero usar a opção -a de perf, bem como a opção -p.

Eu executo perf de duas maneiras e obtenho resultados um pouco diferentes em cada maneira.

As primeiras maneiras de executar o seguinte comando perf em uma janela

perf stat -p 2413 -a

e execute imediatamente a carga de trabalho do banco de dados em outra janela. Quando a carga de trabalho do banco de dados termina, eu controlo C fora do desempenho e obtenho os seguintes resultados

    Performance counter stats for process id '79894':

              1,842,359.55 msec cpu-clock                 #   30.061 CPUs utilized          
                 3,798,673      context-switches          #    0.002 M/sec                  
                   153,995      cpu-migrations            #    0.084 K/sec                  
                16,038,992      page-faults               #    0.009 M/sec                  
         4,939,131,149,436      cycles                    #    2.681 GHz                    
         3,924,220,386,428      stalled-cycles-frontend   #   79.45% frontend cycles idle   
         3,418,137,943,654      instructions              #    0.69  insn per cycle         
                                                          #    1.15  stalled cycles per insn
           402,389,588,237      branches                  #  218.410 M/sec                 
             5,137,510,170      branch-misses             #    1.28% of all branches  


     61.28834199 seconds time elapsed

O segundo método é executar

perf stat  -a  sleep 61

em uma janela e execute imediatamente a carga de trabalho do banco de dados em outra janela. Após 61 segundos, o perf e a carga de trabalho terminam e o perf produz os seguintes resultados

 Performance counter stats for 'system wide':

      4,880,317.67 msec cpu-clock                 #   79.964 CPUs utilized          
         8,274,996      context-switches          #    0.002 M/sec                  
           202,832      cpu-migrations            #    0.042 K/sec                  
        14,605,246      page-faults               #    0.003 M/sec                  
 5,022,298,186,711      cycles                    #    1.029 GHz                    
 7,599,517,323,727      stalled-cycles-frontend   #  151.32% frontend cycles idle   
 3,421,512,233,294      instructions              #    0.68  insn per cycle         
                                                  #    2.22  stalled cycles per insn
   402,726,487,019      branches                  #   82.521 M/sec                  
     5,124,543,680      branch-misses             #    1.27% of all branches        

      61.031494851 seconds time elapsed

Como usei -a em ambas as versões, esperava obter aproximadamente os mesmos resultados.

Mas com o sono,

cpu-clock is 2.5 times what you get with the -p version, 
context-switches are double what you get with the -p version  
and the other values are more or less the same

Então, 2 perguntas,

    (1) which set of results do I believe?
and 
    (2) how can there be more stalled-cycles-frontend than cycles in the sleep version?

informação relacionada