Linux Performance Counters mit perf und perf-tools

Aus Thomas-Krenn-Wiki
Zur Navigation springen Zur Suche springen

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:

Weitere nützliche Informationen finden Sie unter:

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
  • perf probe /lib/libc.so.6 malloc
  • perf record -e probe_libc:malloc -aR sleep 5
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

zur Verfügung. Eine Präsentation zu den Tools von der LISA2014 findet sich unter:

Brendan Gregg stellt seine perf-tools vor [1] Folie 50 (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:

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


Foto Georg Schönberger.jpg

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.


Das könnte Sie auch interessieren

IPv6 deaktivieren
Webserver Verzeichnisse mit Passwort schützen
Zeitsynchronisation unter Linux mit DCF77 Funkuhr-Modul und ntpd