Wie wir dem Linux Perf GUI Performance Analysis Tool (Hotspot) einen Hauch von Perfektion hinzugefügt haben

Während eines unserer Projekte haben wir den Linux Perf GUI-Profiler durch die Entwicklung seiner neuen Funktionalität verbessert.



Kundenbedürfnisse können durch die folgenden Merkmale des gewünschten Profilers ausgedrückt werden:



  • über ein Leistungsanalysetool für einen bestimmten Satz von Architekturen verfügen;
  • in der Lage sein, eine eingehende Analyse der Leistung bis hin zu Anweisungen in zerlegtem Code durchzuführen;
  • ein Mittel zum Anzeigen und Arbeiten mit der Ausgabe von disassembliertem Code in einer praktischen GUI für einen solchen Satz von Architekturen zu haben - x86_64, ARMv7, ARMv8.


Das heißt, ein Profiler wurde benötigt, der:



  • plattformübergreifend sein;
  • in der Lage sein, einen Disassembler für Funktionen für Architekturen aus dieser Menge zu generieren - x86_64, ARMv7, ARMv8;
  • Zeigen Sie die Ergebnisse an und interagieren Sie mit dem Benutzer über die GUI, um die Benutzerfreundlichkeit zu gewährleisten.


Um den Anforderungen des Kunden gerecht zu werden, haben wir eine neue Systemkomponente entwickelt - einen plattformübergreifenden Disassembler mit Codegenerierung für x86_64, ARMv7, ARMv8 (Funktionalität und GUI für die Arbeit mit der Ausgabe).



Schauen wir uns ein Beispiel für eine einfache Demo von C ++ - Code auf Hotspot in Aktion und die darin enthaltenen Leistungsanalysefunktionen an. Beispiel:



cat demo.cpp:
#include <iostream>
int g (int arg) {
    return abs(rand()) * arg;
}

int f() {
    int i = 1;
    int res = 1 ;

    std::cout << abs(rand()) << std::endl;
    while (i < 1000000) {
        res += i * g(res);
        i++;
    }
    std::cout << res << std::endl;
    return res;
}

int main() {
    std::cout << f() << std::endl;
    return 0;
}


Wir kompilieren, erstellen unsere Demo-Anwendung:



 g++ demo.cpp -o demo


Starten Sie unseren Profiler:



./hotspot


Schritt 1 - Sammeln und Schreiben von Daten in die Datei perf.data.



Dies kann auf zwei Arten erfolgen - über die Befehlszeile mit einem expliziten Aufruf von perf



record -o /home/demo/perf.data --call-graph dwarf ./demo


Oder verwenden Sie das Hotspot-Menü Datei-> Daten aufzeichnen.



Für unsere Demo erfassen wir Ereignisse vom Typ Zyklen. Sie können jedoch auch andere oder mehrere Ereignistypen festlegen (Cache-Fehler, Anweisungen, Verzweigungsfehler usw.).







Klicken Sie auf Aufzeichnung starten und warten Sie, bis die Ergebnisse anzeigen leuchten:







Tauchen Sie ein in die Welt der Leistungsanalyse.



Hier finden Sie zusammenfassende Informationen und Champions unter den Verbrauchern der Laufzeit unserer Demo.







Anrufketten in beide Richtungen - von der aufgerufenen zur aufrufenden Methode (Bottom Up) und umgekehrt (Bottom Down) mit Zeiten (Gewichten).















Flammendiagramm und Daten zur Leistung, Ausführungszeit für jede

Funktion / Methode, die für sie von Bedeutung ist.



Um detailliertere Informationen über die Funktion zu erhalten, an der wir interessiert sind, mit der Verteilung der darin enthaltenen Ereignisse (bis zur Anweisung des zerlegten Codes), drücken Sie im Kontextmenü auf den Punkt Zerlegen. Es wird geöffnet, indem Sie mit der rechten Maustaste auf die gewünschte Funktion klicken:







Jetzt wissen wir alles über diese Funktion!







Sie können im Aufrufstapel navigieren. Doppelklicken Sie auf eine blau hervorgehobene Anrufanweisung. Und vor uns liegt ein Disassembler für die aufgerufene Funktion g (int). Der CPU-verbrauchende Befehl hat hier keine Konkurrenten.







Strg + B, Strg + D - und wir haben auch Maschinencode von Befehlen, und der Disassembler wurde mit objdump generiert. In den vorherigen Fällen wurde der Code angezeigt, der durch Aufrufen von perf annotate generiert wurde.







Die Zurück-Taste leuchtet auf, Sie können sich entlang des Anrufstapels in beide Richtungen bewegen!



Doppelklicken Sie auf die Anweisung mit der Adresse 1236, um zur Anweisung mit der Adresse 124f zu gelangen. Und wieder ist der Übergang zurück zum Befehl mit der Adresse 1236 verfügbar.







Strg + B, Strg + I schaltet uns auf Intel Assembler-Syntax um: Wir







freuen uns über die Möglichkeit, nach Text anhand des eingegebenen Musters zu suchen, beispielsweise mithilfe des Registers% rsp:







Und ... ohne den Ort zu verlassen, wechseln wir zu ARM ... Dazu benötigen wir grundsätzlich zwei Entitäten - die ausführbare Datei der Benutzeranwendung, die auf ARM kompiliert wurde, und die dort aufgezeichnete Datei perf.data. In unserer Demo sind dies coremark.1.exe und perf.1.fp.cycles.data, die auf ARMv8 basieren. Wir setzen sie in / home / demo / armv8 / und laden perf.data -











Damit haben wir die vom Kunden gestellten Aufgaben nicht nur erfüllt, sondern auch übertroffen - insbesondere die Berechnung und Anzeige der Ereignisverteilung nach den Anweisungen des Disassemblers ermöglicht uns eine eingehende Analyse bis zu einer Anweisung, die mit einer Zeichenfolge im Code verknüpft werden kann. Das Programm verfügt über eine GUI - eine benutzerfreundliche Oberfläche mit Cross-Profiling-Einstellungen.



Der Linux Perf Gui Hotspot wird unter den Bedingungen der GNU General Public License nach Vereinbarung mit unseren Partnern vertrieben. Mit anderen Worten, wir gewähren allen interessierten Benutzern das Recht, dieses Profiler-Programm kostenlos zu kopieren, zu ändern und zu verteilen.



Es wird auf GitHub zusammen mit Anweisungen zum Herunterladen und Installieren gehostet . Jeder kann es kennenlernen und schätzen.



Wir laden Sie ein, mit Linux Perf GUI (Hotspot) eine spannende Reise durch Ihre Anwendung und die Besonderheiten ihrer Arbeit zu unternehmen, in die Elite-Atmosphäre der Montageteams einzutauchen, verschiedene Architekturen zu besuchen und vieles mehr.



All Articles