¿Cuál de las dos metodologías es la correcta para obtener estadísticas de rendimiento en un proceso multiproceso?

¿Cuál de las dos metodologías es la correcta para obtener estadísticas de rendimiento en un proceso multiproceso?

Estoy investigando el rendimiento de un servidor de bases de datos multiproceso. Hay una carga de trabajo particular que se ejecuta en aproximadamente 61 segundos en una máquina en particular. El pid del proceso de la base de datos fue 79894 cuando ejecuté perf contra la carga de trabajo.

Además de los subprocesos de software en el servidor de la base de datos, hay varios subprocesos relacionados con Linux, que normalmente están inactivos en un sistema inactivo, que se activan mientras se ejecuta mi carga de trabajo. Por lo tanto, quiero usar la opción -a de perf así como la opción -p.

Ejecuto perf de dos maneras y obtengo resultados algo diferentes en cada una de ellas.

Las primeras formas en que ejecuto el siguiente comando perf en una ventana

perf stat -p 2413 -a

e inmediatamente ejecute la carga de trabajo de la base de datos en otra ventana. Cuando finaliza la carga de trabajo de la base de datos, controlo C fuera de rendimiento y obtengo los siguientes 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

El segundo método es ejecutar

perf stat  -a  sleep 61

en una ventana y ejecutar inmediatamente la carga de trabajo de la base de datos en otra ventana. Después de 61 segundos, tanto el rendimiento como la carga de trabajo finalizan y el rendimiento produce los siguientes 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 usé -a en ambas versiones, esperaba obtener aproximadamente los mismos resultados.

Pero con el sueño,

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

Entonces 2 preguntas,

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

información relacionada