Какая из двух методологий является правильной для получения статистики производительности многопоточного процесса?

Какая из двух методологий является правильной для получения статистики производительности многопоточного процесса?

Я исследую производительность многопоточного сервера базы данных. Есть определенная рабочая нагрузка, которая выполняется примерно за 61 секунду на определенной машине. PID процесса базы данных был 79894, когда я запустил perf против рабочей нагрузки.

В дополнение к потокам программного обеспечения на сервере базы данных, есть ряд потоков, связанных с Linux, которые обычно бездействуют в бездействующей системе, и которые становятся активными во время выполнения моей рабочей нагрузки. Таким образом, я хочу использовать опцию -a perf, а также опцию -p.

Я запускаю perf двумя способами и получаю несколько разные результаты каждым способом.

Первые способы, которыми я запускаю следующую команду perf в одном окне

perf stat -p 2413 -a

и немедленно запустить рабочую нагрузку базы данных в другом окне. Когда рабочая нагрузка базы данных заканчивается, я контролирую C из perf и получаю следующие результаты

    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

Второй способ — запустить

perf stat  -a  sleep 61

в одном окне и немедленно запустить рабочую нагрузку базы данных в другом окне. Через 61 секунду и perf, и рабочая нагрузка завершаются, и perf выдает следующие результаты

 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

Поскольку я использовал -a в обеих версиях, я ожидал получить примерно одинаковые результаты.

Но со сном,

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

Итак, 2 вопроса:

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

Связанный контент