
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?