Linux Performance Counters mit perf und perf-tools
Linux Performance Counters oder auch perf_events werden über das perf Kommando abgefragt und analysiert. Das perf Kommando ist unter Ubuntu Teil des Packages linux-tools-common. perf_events waren zu Beginn unter dem Begriff Performance Counters for Linux (PCL) bekannt. Sie werden für die Performance-Analyse und Auswertung von Performance Counters verwendet und werten z.B. spezielle Hardware Register der CPUs (PMU) aus. Dadurch können Events wie ausgeführte Instruktionen oder Cache Misses aufgezeichnet und analysiert werden. Darüber hinaus bieten die perf Programme auch Tracing Funktionalitäten um Kernel-Funktionen auszuwerten.[1]
Im Gegensatz zu z.B. strace sind perf_events beim Profilen dafür bekannt, die Performance der Applikation nicht zu sehr zu beeinträchtigen. Weitere Eigenschaften von perf sind
- Viele Sub-Kommandos, die sich auf eine Aufgabe spezialisieren
- Workload-Aufzeichnung pro Thread, pro Prozess, pro CPU oder systemweit
- Keine laufenden Daemons, nur Werkzeuge direkt auf der Kommandozeile
Dokumentation
Die Kernel Dokumentation ist im Verzeichnis:
- tools/perf/Documentation/examples.txt
z.B für 3.19.1:
- Kernel 3.19.1 perf (kernel.org)
Weitere nützliche Informationen finden Sie unter:
- perf Wiki Tutorial (perf.wiki.kernel.org)
- The Unofficial Linux Perf Events Web-Page (web.eece.maine.edu)
- Modern CPU Performance Analysis on Linux (halobates.de)
- perf User Guide (google.com)
perf Kommandos im Überblick
Hier die wichtigsten perf Kommandos:
Kommando | Zweck |
---|---|
perf list | Liste an Events anzeigen |
perf stat | Event Statistiken sammeln |
perf record | Event Profile erstellen (Profiling) |
perf record -e 'syscalls:*' | Static Tracing |
perf probe + perf record | Dynamic Tracing (Probes) |
perf report | Reporting von aufgenommenen Records |
perf top | Performance counter in Real Time sammeln |
Eine gesamte Liste der Kommandos finden Sie im perf Wiki oder per Eingabe von perf
auf der Kommandozeile!
Nützliche perf Einzeiler
Weitere Einzeiler finden Sie auch unter perf Examples - One Liners (brendangregg.com).
perf Befehl | Zweck |
---|---|
perf top --pid 4766 | Live perf_events Analyse zu PID 4766 aufzeichnen |
perf record --pid 4766 | Samples zu PID 4766 aufzeichnen |
|
probe setzen und malloc in der libc tracen |
perf stat -e cycles:u,instructions:u -a -C 1 | Auf CPU 1 limitieren, CPU Instruktionen messen |
perf stat -e 'ext4:*' -a sleep 10 | ext4 Events vom gesamten System für 10s sammeln |
Live Events mit perf top
perf top
zeigt im traditionellen Top-Stil aktuelle laufende Events vom System oder zu einer Prozess-ID an:
# perf top 20,90% libxul.so [.] 0x00000000008ec220 9,43% libv8.so [.] 0x000000000009afe3 5,19% perf [.] 0x0000000000056584 4,61% libblink_web.so [.] 0x000000000043c7d3 2,85% firefox [.] 0x000000000000eb64 [...] # perf top --pid 24410 86,05% python2.7 [.] PyEval_EvalFrameEx 3,33% python2.7 [.] list_ass_subscript.16933 2,49% python2.7 [.] rangeiter_next.21172 [..]
Filtern nach Events wird ebenfalls unterstützt:
# perf top -p 25396 -e instructions Samples: 40K of event 'instructions', Event count (approx.): 37825818495 73,92% python2.7 [.] PyEval_EvalFrameEx 8,31% python2.7 [.] list_ass_subscript.16933 4,16% python2.7 [.] rangeiter_next.21172
Liste von Events
Der Befehl perf list
zeigt die von perf unterstützten und vordefinierten Events, die mit -e verwendet werden können.
Die Befehle teilen sich in die Sparten:
- Hardware Events (PMUs, s.a. Abschnitt RAW CPU Counters)
- Software Events (z.B. Context Switches)
- Tracepoints (Zeilen im Kernel Code, die mit Event versehen sind)
# perf list List of pre-defined events (to be used in -e): cpu-cycles OR cycles [Hardware event] instructions [Hardware event] cache-references [Hardware event] cache-misses [Hardware event] [...] xen:xen_cpu_write_gdt_entry [Tracepoint event] xen:xen_cpu_set_ldt [Tracepoint event] # perf list | wc -l 1403
Statistiken zu Programmen sammeln
perf stat
sammelt Performance Counter Statistics, ohne Angabe eines speziellen Events liefert es eine Zusammenfassung der gesammelten Counter.
$ man perf-stat
- Zum Beispiel für Python Programme:
# perf stat python numpy-matrix.py -i matrix.in Performance counter stats for 'python numpy-matrix.py -i matrix.in': 532,132546 task-clock (msec) # 0,998 CPUs utilized 62 context-switches # 0,117 K/sec 2 cpu-migrations # 0,004 K/sec 9.736 page-faults # 0,018 M/sec 1.652.381.223 cycles # 3,105 GHz [83,37%] 746.873.941 stalled-cycles-frontend # 45,20% frontend cycles idle [83,47%] 379.979.967 stalled-cycles-backend # 23,00% backend cycles idle [66,97%] 2.776.008.940 instructions # 1,68 insns per cycle # 0,27 stalled cycles per insn [83,50%] 574.792.729 branches # 1080,168 M/sec [83,47%] 3.423.864 branch-misses # 0,60% of all branches [82,72%] 0,533060251 seconds time elapsed
- Systemweit für 10 Sekunden Syscall Events sammeln und per Tracepoint aufsummieren
# perf stat -e 'syscalls:*' -a sleep 5
Samples mit record aufnehmen
Mit perf record
werden die Events per Tracepoint und Programmnamen aufsummiert:
# perf record -e 'syscalls:*' -a sleep 5 # perf report
Praktischerweise lässt sich auch ein bereits laufender Prozess aufnehmen:
# ps aux | grep firefox gschoenb 4766 12.5 13.2 2573504 1068276 ? Sl 07:11 25:35 /usr/lib/firefox/firefox # perf record --pid 4766 ^C[ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 1.407 MB perf.data (~61466 samples) ] # perf report
Die Option -g fügt der Aufnahme außerdem Call-Graphen von eingesetzten Funktionen hinzu.
perf-tools Collection
perf-tools sind eine Sammlung von Userspace Werkzeugen, die perf_events und ftrace verwendet. Die Tools stehen auf github unter
- perf-tools (github.com)
zur Verfügung. Eine Präsentation zu den Tools von der LISA2014 findet sich unter:
- Linux Performance Analysis New Tools and Old Secrets (slideshare.net)
# git clone https://github.com/brendangregg/perf-tools.git
Folgende Tools sind darin enthalten:
perf-tools# find . -type f -executable | grep -v git ./net/tcpretrans ./killsnoop ./execsnoop ./opensnoop ./iosnoop ./misc/perf-stat-hist ./tools/reset-ftrace ./kernel/funcslower ./kernel/functrace ./kernel/funccount ./kernel/kprobe ./kernel/funcgraph ./disk/bitesize ./system/tpoint ./iolatency ./fs/cachestat ./syscount
RAW CPU Counters
Vorteile von Performance Monitoring Units (PMU) CPU Counters:[2]
- Geringer Overhead (in Hardware implementiert)
- Geringe Einflüsse auf andere Komponenten (z.B. ALU)
- Hoher Auflösungsgrad (HW-Events, die durch SW nicht gemessen werden können)
Da für jede CPU-Mikroarchitektur die PMUs unterschiedlich sind, werden die Counters/Events von den Herstellern dokumentiert:
- Performance monitoring event lists for Intel processors (download01.org)
- Die README beschreibt außerdem die Bedeutung der Event List Fields:
- perfmon README (download01.org)
Ein anderer Weg, direkt für die lokale CPU, für über libpfm4:[3]
# git clone git://perfmon2.git.sourceforge.net/gitroot/perfmon2/libpfm4 # cd libpfm4 # make # cd examples/ # ./showevtinfo # ./showevtinfo | grep LLC | grep MISSES # ./check_events LLC_MISSES | grep Codes Codes : 0x53412e
Dieser RAW Code kann dann als Event bei perf eingesetzt werden:
# perf stat -e r53412e sleep 5
Einzelnachweise
- ↑ Linux Performance Analysis: New Tools and Old Secrets (brendangregg.com)
- ↑ Hardware Performance Monitoring (cse.shirazu.ac.ir)
- ↑ How to monitor the full range of CPU performance events (bnikolic.co.uk)
Autor: Georg Schönberger Georg Schönberger, Abteilung DevOps bei der XORTEX eBusiness GmbH, absolvierte an der FH OÖ am Campus Hagenberg sein Studium zum Bachelor Computer- und Mediensicherheit, Studium Master Sichere Informationssysteme. Seit 2015 ist Georg bei XORTEX beschäftigt und arbeitet sehr lösungsorientiert und hat keine Angst vor schwierigen Aufgaben. Zu seinen Hobbys zählt neben Linux auch Tennis, Klettern und Reisen.
|