2012-08-26 10 views
5

Gibt es eine Möglichkeit, Leistungsindikatoren in Linux regelmäßig zu lesen?Lesen Leistungsindikatoren regelmäßig in Linux

So etwas wie perf stat mit der Fähigkeit, jeden X-Zyklen zu probieren, was ich suche.

Grundsätzlich möchte ich in der Lage sein, den Befehlszähler (Anzahl der ausgeführten Anweisungen) jede X Menge von CPU-Zyklen für ein Programm zu lesen.

Antwort

5

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.

+0

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

+0

@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

+0

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

0

Sie können die Perf-Statistik einfach ändern, um dies zu tun.

In der Tat, ich habe eine grobe Änderung bereits umgesetzt und würde sich freuen, mit Ihnen diese Änderung zu teilen ..

Die Änderungen, die ich in der während sind meist in der run_perf_stat Funktion gemacht (! Done) Schleife

bewegen

einfach die Zeilen unterhalb der während {sleep (1);} (done!) bis in der Schleife und ändern Sie den Schlaf zu einem Nanosleep mit dem Zeitraum, den Sie bei

probieren wollen, dass perf Druck machen sollte der Ausgang von STDOUT (oder STDERR)

Wenn Sie diese Werte speichern möchten, empfehle ich, ein zweidimensionales Array vom Typ struct stats zu erstellen, dieses mit jedem Beispiel zu aktualisieren und regelmäßig in eine Datei zu schreiben

4

Gute Neuigkeiten: Im nächsten Kernel (Linux 3.9) Perf stat hat eine Option -I msecs, um Ereignisdeltas in regelmäßigen Zeitintervallen zu drucken.

https://patchwork.kernel.org/patch/2004891/

$ perf stat -I 1000 -e cycles noploop 10 
noploop for 10 seconds 
1.000086918   2385155642 cycles     # 0.000 GHz 
2.000267937   2392279774 cycles     # 0.000 GHz 
3.000385400   2390971450 cycles     # 0.000 GHz 
4.000504408   2390996752 cycles     # 0.000 GHz 
5.000626878   2390853097 cycles     # 0.000 GHz 

http://man7.org/linux/man-pages/man1/perf-stat.1.html

-I msecs, --interval-print msecs 

Drucken Zählung Deltas alle N Millisekunden (Minimum: 10 ms)

+0

Danke für die Köpfe hoch. – Ben

+0

Die Option ist "-I 1000" für 1 Sek. Drucken: http://man7.org/linux/man-pages/man1/perf-stat.1.html - '-I msecs, --interval-print msecs' "Druckzählungsdeltas alle N Millisekunden (Minimum: 10 ms)" – osgx