Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial Internet of Things >> Internet der Dinge-Technologie

Profilerstellung verteilter Anwendungen mit Perf

Wie viele Entwickler war ich in Situationen, in denen ich eine vorhandene Anwendung nehmen und schneller machen musste – im Wesentlichen indem ich langsamen Code entfernte und durch schnellen Code ersetzte. Ich weiß jetzt, dass ich eine einfache Regel befolgen muss, wenn es um die Optimierung von Code geht:

Was auch immer Code meiner Meinung nach die Anwendung verlangsamt, hier sollte ich zuletzt suchen.

Profiling ist ein Handwerk, bei dem Sie sich sehr schnell mit den Grenzen Ihrer Intuition abfinden. Mir wurde früh klar, dass ich kalte, harte Messungen brauchte, um mir zu sagen, welche Teile meines Codes optimiert werden mussten. Glücklicherweise gibt es eine Vielzahl von Profiling-Tools, die so ziemlich alles messen können, was mit der Ausführung Ihres Codes zu tun hat.

Tools machen die Profilerstellung jedoch nicht unbedingt einfach. Die Interpretation von Messungen kann schwierig sein, und Variablen müssen bei der Durchführung von Experimenten streng kontrolliert werden. Insbesondere Multithread- und verteilte Anwendungen sind schwer zu profilieren.

Jeder, der schon einmal eine Race-Condition debuggen musste, wird wissen, wie zeitkritisch das Verhalten von Multithread-Anwendungen ist. Die Profilerstellung von Multithread-Anwendungen hat ähnliche Herausforderungen, da das Timing ein wichtiger Faktor bei der Messung wird.

Profiler wie callgrind verlangsamen Ihr Programm erheblich und wirken sich daher auf das Timing aus. Ein Beispiel, das eine Einschränkung solcher Profiler zeigt, ist die Mutex-Konkurrenz. Ihre Anwendung wird möglicherweise langsam ausgeführt, da ein Mutex stark verwendet wird, wodurch Ihr Code viel Zeit in Sperrfunktionen verbringt. Ein Tool wie callgrind würde dies nicht verraten, da es Anweisungen zählt , nicht die Zeit.

Es gibt eine andere Klasse von Profilern, die „statistisches Profiling“ durchführen. Mit diesen Profilern können Sie Ihr Programm wie gewohnt ausführen, während Sie regelmäßig Momentaufnahmen davon machen, wo die Anwendung ihre Zeit verbringt. Diese Profiler müssen einige Zeit laufen, um genaue Ergebnisse zu erzielen, können dies jedoch mit minimalen Auswirkungen auf das Timing tun. Das macht sie ideal für die Profilerstellung von Multithread- und/oder verteilten Anwendungen!

Ich wollte einen Profiling-Workflow mit dem Linux-Perf-Tool teilen, das ich als besonders nützlich empfand, da es mir ermöglicht, Leistungs-„Hotspots“ schnell zu identifizieren. Ich werde das c/hello_dynamic-Beispiel aus RTI Connext 5.3.0 als Ziel für die Leistungsmessung verwenden.

Stellen Sie zunächst sicher, dass perf auf Ihrem Linux-Computer installiert ist. Unter Ubuntu musste ich diesen Befehl ausführen, um perf auf meinem Computer zu installieren:

sudo apt-get install linux-tools-common linux-tools-3.13.0-107-generic

Als Nächstes müssen Sie ein GitHub-Projekt herunterladen, das die Ausgabe von perf in einen sogenannten „FlameGraph“ umwandeln kann, der eine visuelle Darstellung der gesammelten Profiling-Daten ist. Führen Sie diesen Befehl von einem Ort aus, auf den Sie bequem zugreifen können (wie Ihr Home-Verzeichnis):

git-Klon https://github.com/brendangregg/FlameGraph

Navigieren Sie nun zum hello_dynamic-Beispiel im Ordner rti_workspace/examples/c. Erstellen Sie den Code mit diesen Befehlen (stellen Sie sicher, dass NDDSHOME auf die RTI Connext-Installation eingestellt ist):

DEBUG exportieren=1
make -f makefile_Hello_x64Linux3gcc4.8.2

Die Plattform im Namen des Makefiles kann sich von Ihrer Plattform unterscheiden. Beachten Sie, wie wir die Umgebungsvariable DEBUG setzen. Wir tun dies, damit die Binärdatei Debugging-Symbole enthält, die es uns ermöglichen, die Namen der Funktionen in den Callstacks zu sehen, die perf ausgeben.

Wir können jetzt perf für unseren Code ausführen. Führen Sie die folgenden Befehle aus:

objs/x64Linux3gcc4.8.2/Hallo Sub &
sudo perf record -g objs/x64Linux3gcc4.8.2/Hallo pub

Drücken Sie nach einiger Zeit Strg-C, um den Publisher zu verlassen. Perf hat eine Datei namens „perf.out“ erstellt. Wir müssen diese Datei jetzt in etwas übersetzen, das das FlameGraph-Tool versteht, indem wir ein Skript aus dem FlameGraph-Repository verwenden:

perf script -f | ~/FlameGraph/stackcollapse-perf.pl> out.perf-folded

Von hier aus können wir das FlameGraph-Bild generieren:

~/FlameGraph/flamegraph.pl out.perf-folded> perf.svg

Wenn Sie die Datei perf.svg in einem Webbrowser öffnen, sollte sie ungefähr so ​​​​aussehen:


Die horizontale Achse stellt die in einer bestimmten Funktion verbrachte Zeit dar, während die gestapelten Balken die Aufrufliste Ihrer Anwendung darstellen. Sie können auf jeden Balken klicken, um in diesen bestimmten Stapel hineinzuzoomen.

Versuchen Sie, den Publisher erneut auszuführen, jedoch ohne Abonnenten. Sie werden feststellen, dass der rechte Teil des Flammendiagramms verschwindet, da DDS keine Daten sendet, wenn keine Abonnenten vorhanden sind!

Das Perf-Tool kann viel mehr als das, was in diesem Blog beschrieben wird. Wenn Sie andere Einstellungen oder Tools kennen, die Ihr Profiling-Leben einfacher gemacht haben, lassen Sie es uns wissen!

Viel Spaß beim Profilieren!


Internet der Dinge-Technologie

  1. Wird Molybdän mit anderen Elementen kombiniert?
  2. Erstellen hybrider Blockchain-/Cloud-Anwendungen mit Ethereum und Google
  3. Erstellen serverloser mobiler Anwendungen mit React Native und AWS
  4. Einfache Näherungssensorschaltung und Arbeiten mit Anwendungen
  5. Typen analoger und digitaler Sensoren mit Anwendungen
  6. Mikrochip:Skalieren von Weltraumanwendungen mit COTS-zu-strahlungstoleranten Core-MCUs
  7. Eliminieren Sie IT-Engpässe mit Leichtigkeit:Low-Code-Plattformen haben den Schlüssel
  8. Ovo verbessert sein Spiel mit verteilter Energie mit dem Kauf von VCharge Smart Grid
  9. CNC-Holzfräser - mit atemberaubenden Anwendungen
  10. 5 reale Anwendungen von KI in der Medizin (mit Beispielen)