Es scheint, dass das Perf-Tool in Linux funktioniert, indem ein Ereignis aufgezeichnet wird, wenn die Zähler einen bestimmten Wert erreichen, anstatt in regelmäßigen Intervallen zu samplen.
Befehl perf record -e cycles,instructions -c 10000
speichert ein Ereignis alle 10000 Zyklen und alle 10000 Anweisungen. Es kann gegen einen neuen Befehl oder eine bestehende PID ausgeführt werden. Es wird im aktuellen Verzeichnis unter perf.data
gespeichert.
Die Analyse der Daten ist eine andere Sache. Mit perf script
bekommt man ganz in der Nähe:
ls 16040 2152149.005813: cycles: c113a068 ([kernel.kallsyms])
ls 16040 2152149.005820: cycles: c1576af0 ([kernel.kallsyms])
ls 16040 2152149.005827: cycles: c10ed6aa ([kernel.kallsyms])
ls 16040 2152149.005831: instructions: c1104b30 ([kernel.kallsyms])
ls 16040 2152149.005835: cycles: c11777c1 ([kernel.kallsyms])
ls 16040 2152149.005842: cycles: c10702a8 ([kernel.kallsyms])
...
Sie benötigen ein Skript zu schreiben, die eine Reihe von Linien von diesem Ausgang nimmt und zählen die Anzahl der ‚Zyklen‘ und ‚Anweisungen‘ Ereignisse in diesem Satz. Sie können die Auflösung anpassen, indem Sie den Parameter -c 10000
im Aufzeichnungsbefehl ändern.
Ich verifizierte die Analyse, indem Sie perf stat
und perf record
gegen ls /
ausführen. Stat berichtete 2 634 205 Zyklen, 1 725 255 Anweisungen, während Skriptausgabe 410 Zyklen Ereignisse und 189 Instruktionsereignisse hatte. Je kleiner der Wert -c
ist, desto mehr Overhead scheint in den Zyklen zu liegen.
Es gibt auch eine -F
Option zu perf record
, die in regelmäßigen Abständen Proben. Ich habe jedoch keine Möglichkeit gefunden, die Zählerwerte abzurufen, wenn diese Option verwendet wird.
Bearbeiten:perf stat
funktioniert offenbar auch auf PIDs, und erfasst Daten, bis Strg-C gedrückt wird. Es sollte ziemlich einfach sein, die Quelle so zu modifizieren, dass sie immer für N Sekunden erfasst und dann in einer Schleife läuft.
Wie Sie führen Perf-Skript aus? Ich habe versucht, 'Perf-Record -e Zyklen, Anweisungen -c 10000-R ls laufen;' 'perf Skript', aber ich bekomme eine ** Fatal: keine event_list! ** Fehler. – Ben
@Skim seltsam, für mich funktioniert nur "Perf-Skript" funktioniert. Funktioniert "perf report" für Sie, d. H. Ist die aufgezeichnete Datei perf.data in Ordnung? – jpa
Es stellte sich heraus, dass ich eine ältere Version von perf (2.6) verwendet habe. perf 3.0.38 funktioniert wie Sie oben angegeben. Ich werde zurückkommen und Sie auffrischen, wenn ich genug Wiederholungen habe. Danke! – Ben