멀티스레드 프로세스에서 성능 통계를 얻는 두 가지 방법 중 올바른 것은 무엇입니까?

멀티스레드 프로세스에서 성능 통계를 얻는 두 가지 방법 중 올바른 것은 무엇입니까?

저는 다중 스레드 데이터베이스 서버의 성능을 연구하고 있습니다. 특정 시스템에서 실행하는 데 약 61초가 걸리는 특정 작업 부하가 있었습니다. 워크로드에 대해 perf를 실행할 때 데이터베이스 프로세스의 pid는 79894입니다.

데이터베이스 서버의 소프트웨어 스레드 외에도 일반적으로 유휴 시스템에서는 휴면 상태이지만 워크로드가 실행될 때 활성화되는 Linux 관련 스레드가 많이 있습니다. 그래서 -p 옵션뿐만 아니라 perf의 -a 옵션도 사용하고 싶습니다.

나는 두 가지 방법으로 성능을 실행하고 각 방법마다 다른 결과를 얻습니다.

창에서 다음 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?

관련 정보