Welche der beiden Methoden ist die richtige, um Leistungsstatistiken für einen Multithread-Prozess zu erhalten?

Welche der beiden Methoden ist die richtige, um Leistungsstatistiken für einen Multithread-Prozess zu erhalten?

Ich untersuche die Leistung eines Multithread-Datenbankservers. Es gibt eine bestimmte Arbeitslast, die auf einer bestimmten Maschine in etwa 61 Sekunden ausgeführt wird. Die PID des Datenbankprozesses war 79894, als ich Perf für die Arbeitslast ausführte.

Zusätzlich zu den Software-Threads im Datenbankserver gibt es eine Reihe von Linux-bezogenen Threads, die auf einem inaktiven System normalerweise inaktiv sind und während der Ausführung meiner Arbeitslast aktiv werden. Daher möchte ich sowohl die Option -a von perf als auch die Option -p verwenden.

Ich führe Perf auf zwei Arten aus und erhalte mit jeder Methode etwas unterschiedliche Ergebnisse.

Die ersten Möglichkeiten, wie ich den folgenden Perf-Befehl in einem Fenster ausführe

perf stat -p 2413 -a

und führe die Datenbank-Arbeitslast sofort in einem anderen Fenster aus. Wenn die Datenbank-Arbeitslast abgeschlossen ist, steuere ich C aus der Leistung und erhalte die folgenden Ergebnisse

    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

Die zweite Methode besteht darin,

perf stat  -a  sleep 61

in einem Fenster und führen Sie sofort die Datenbank-Arbeitslast in einem anderen Fenster aus. Nach 61 Sekunden werden sowohl perf als auch die Arbeitslast beendet und perf erzeugt die folgenden Ergebnisse

 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

Da ich in beiden Versionen -a verwendet habe, erwartete ich, ungefähr die gleichen Ergebnisse zu erhalten.

Aber mit dem Schlaf,

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

Also 2 Fragen,

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

verwandte Informationen