2014-10-08 10 views
6

Wie verwende ich ftrace() (oder irgendetwas anderes), um eine bestimmte, benutzerdefinierte Funktion im Linux-Kernel zu verfolgen? Ich versuche, einige Mikrobenchmarks zu erstellen und auszuführen, also möchte ich die Zeit haben, die bestimmte Funktionen benötigt, um ausgeführt zu werden. Ich habe (zumindest so viel ich kann) die Dokumentation gelesen, aber ein Schritt in die richtige Richtung wäre großartig.Wie kann ich eine bestimmte Funktion im Linux-Kernel messen oder verfolgen?

Ich lehne mich zu ftrace(), aber Probleme haben, es auf Ubuntu 14.04 zu arbeiten.

Antwort

1

Verwenden Sie WARN_ON() Es wird einige Spuren der Funktion, die so genannt werden.

Für Zeitverfolgung Ich glaube, Sie Zeitstempel zeigt im Kernel-Log oder jiffies Zähler

1

Auch wird systemtap nützlich sein, in Ihrer Situation verwenden verwenden sollten. Systemtap ist eine Art Werkzeug, mit dem Sie Code wie in Skriptsprachen schreiben können. Es ist sehr leistungsfähig, aber wenn Sie nur eine Ausführungszeit wissen möchten, wäre eine bestimmte Funktion ftrace besser, aber wenn Sie ein sehr fortgeschrittenes Werkzeug benötigen, um beispielsweise Leistungsprobleme im Kernel-Bereich zu analysieren, kann es sehr hilfreich sein.

Pls mehr lesen: (was Sie tun möchten, ist hier: - 5.2 Zeitfunktion Ausführungszeiten) enter link description here

4

Hier sind ein paar Optionen auf der Version des Kernels ab, die Sie haben, können Sie auf, sind:

Systemtap - dies ist der ideale Weg, um die Beispiele, die mit dem Stap kommen, zu überprüfen, Sie können etwas bereit mit minimalen Änderungen zu tun haben.

Oprofile - Wenn Sie ältere Versionen des Kernels verwenden, gibt stap eine höhere Genauigkeit als oprofile.

debugfs mit Stack-Tracer-Option - gut für Stack-Overrun-Debugging. Um dies zu tun, müssten Sie die Tiefenüberprüfungsfunktionen durch mounting debugfs und dann echo 1 > /proc/sys/kernel/stack_tracer_enabled einschalten.

strace - wenn Sie die Systemaufrufe identifizieren, die vom Benutzer-Space-Programm und einigen Leistungsnummern aufgerufen werden. Verwenden Sie strace -fc <program name>

Hoffe, das hilft!

1

Wenn die Ausführungszeit der Funktion interessant ist, weil sie untergeordnete Funktionen für langsame/blockierende Funktionen aufruft, könnte die Verfolgung nach Anweisungen für Sie funktionieren, ohne zu viel Verzerrung aufgrund der "Probeeffekt" -Kosten der Instrumentierung .

probe kernel.statement("[email protected]/file.c:*") { println(tid(), " ", gettimeofday_us(), " ", pn()) } 

gibt Ihnen eine Ablaufverfolgung jeder einzelnen Anweisung in der Funktion name. Deltas zwischen benachbarten Anweisungen können leicht von Hand oder durch ein größeres Skript berechnet werden. Siehe auch https://sourceware.org/systemtap/examples/#profiling/linetimes.stp

0

Um die Präzision zu erhalten, die ich benötigte (CPU-Zyklen), endete ich mit get_cycles(), die im Wesentlichen ein Wrapper für RDTSC (aber portabel) ist. ftrace() mag in Zukunft noch nützlich sein, aber alles, was ich jetzt mache, ist den Unterschied zwischen CPU-Zyklen zu starten und CPU-Zyklen zu beenden und diese als Benchmark zu verwenden.

Update: Um Parallelisierung von Anweisungen zu vermeiden, beendete ich tatsächlich RDTSCP stattdessen. Ich konnte RDTSC + CPUID nicht benutzen, weil das viele Verzögerungen durch hypercalls verursachte (ich arbeite in einer VM).