13 Profiling-Software zum Debuggen von Anwendungsleistungsproblemen

Die Bedeutung von Software-Profiling für Ihre Anwendung

Das Hauptziel Ihrer Anwendung sollte darin bestehen, Ihren Nutzern einen hervorragenden Service zu bieten. Eine gut funktionierende Anwendung zeichnet sich durch Schnelligkeit, Reaktionsfähigkeit, Benutzerfreundlichkeit und Zuverlässigkeit aus. Es ist jedoch keine einfache Aufgabe, Software so zu pflegen, dass sie stets Höchstleistungen erbringt.

Wenn Ihr Code beginnt, unnötige Funktionen aufzurufen, sich selbst zu überlasten, Fehler abfängt und zusätzliche Schleifen durchläuft, kann dies zu Ineffizienzen führen. Ihre Anwendung kann träge werden, nicht mehr reagieren oder sich unvorhersehbar verhalten. Wenn diese Probleme nicht behoben werden, leidet die Gesamtleistung Ihrer Anwendung.

Dies kann dazu führen, dass Ihre Kunden frustriert sind oder Ihre Anwendung gar nicht mehr nutzen, was zu einem schlechten Ruf, Einnahmeverlusten und geringeren Gewinnen führt. Daher ist es wichtig, Ihren Code zu analysieren, zu überprüfen und zu debuggen, um eine optimale Leistung zu gewährleisten. Der schnellste Weg dorthin ist der Einsatz eines Software-Profiling-Tools, mit dem Sie Ihren Code überwachen, Fehler beheben und Leistungsengpässe beseitigen können.

Dieser Artikel beleuchtet die Bedeutung von Software-Profiling und wie es Ihnen helfen kann. Außerdem stellen wir Ihnen einige der besten Profiling-Tools vor, mit denen Sie Ihre Anwendungen debuggen und deren Leistung optimieren können.

Was ist Software-Profiling?

Software-Profiling ist eine dynamische Codeanalyse, bei der das Verhalten eines Programms anhand von Daten untersucht wird, die während der Programmausführung erfasst werden. Ziel ist es, Programmabschnitte zu identifizieren, die optimiert werden müssen, um die Geschwindigkeit und Reaktionsfähigkeit der Anwendung zu verbessern und den Speicher- und Ressourcenverbrauch zu reduzieren.

Ein Software-Profiler misst in der Regel die Dauer und Häufigkeit von Funktionsaufrufen sowie die Speicher- oder Zeitkomplexität eines Programms. Es gibt auch spezialisierte Profiler, wie z. B. Speicher-Profiler.

Das Profiling wird in der Regel durch Instrumentierung des Quellcodes des Programms durchgeführt. Profiler können verschiedene Techniken verwenden, darunter instrumentierte, ereignisbasierte, statistische oder Simulationsmethoden.

Warum ist Software-Profiling wichtig?

Software-Profiling ist unerlässlich, um die Ressourcennutzung und Ausführungszeit einer bestimmten Funktion zu bestimmen. Es hilft, die Geschwindigkeit des Programms zu optimieren und gleichzeitig sicherzustellen, dass nur minimale Ressourcen verbraucht werden.

Darüber hinaus wird es verwendet, um die CPU-Auslastung und die Befehlsausführungszeit zu verfolgen und zu optimieren.

Die Auswahl des richtigen Software-Profiling-Tools ist daher von entscheidender Bedeutung, um leistungsspezifische Probleme schnell zu beheben, die Effizienz zu verbessern und eine bessere Endbenutzererfahrung zu bieten. Viele Profiler bieten detaillierte Berichte und interaktive Grafiken und Visualisierungen, die helfen, die genaue Ursache von Problemen zu finden und deren Behebung zu erleichtern.

Im Folgenden finden Sie eine Liste einiger der besten Software-Profiler, die Sie ausprobieren können. Lassen Sie uns wissen, welches Tool für Sie am besten funktioniert.

spy

spy ist ein hervorragender Sampling-Profiler für Python. Er ermöglicht es Ihnen, einen schnellen Überblick darüber zu erhalten, wie Ihre Python-basierte Anwendung ihre Zeit verbringt.

Dazu müssen Sie Ihren Code nicht ändern oder das Programm vollständig neu starten. py-spy hat einen geringen Overhead und wurde in Rust entwickelt, um eine hohe Ausführungsgeschwindigkeit zu gewährleisten. Es ist nicht dafür ausgelegt, in demselben Prozess wie Ihr zu profilierendes Python-Programm zu laufen. Dies bedeutet, dass py-spy sehr sicher verwendet werden kann, auch in Produktionsumgebungen.

Mit diesem Tool können Sie Profile aufzeichnen und Flame Graphs erstellen, die in interaktive SVG-Dateien umgewandelt werden können. Sie können auch weitere Optionen wie Abtastraten, native C-Erweiterungen für das Profiling, Unterprozesse, Thread-IDs und mehr anzeigen. Der „top“-Befehl ermöglicht eine Live-Ansicht der Funktionen, die in Ihren Programmen ausgeführt werden, während der „dump“-Befehl den aktuellen Aufrufstapel für jeden Python-Thread anzeigt.

Es unterstützt alle Versionen des CPython-Interpreters, z. B. 2.3 – 2.7 und 3.3 – 3.8. Sie können py-spy über PyPI oder GitHub installieren.

Pyroscope

Die Open-Source-Software für kontinuierliches Profiling, Pyroscope, hilft Ihnen dabei, Leistungsprobleme in Ihrer Anwendung innerhalb von Minuten zu beheben.

Sie können den Server starten, gefolgt vom Agenten, egal ob Sie Docker, Linux oder Ruby- oder Go-Dokumente verwenden, Pyroscope unterstützt Sie dabei. Selbst wenn Sie 10 Sekunden oder 10 Monate an Software-Profiling-Daten benötigen, ermöglicht die speziell entwickelte Speicher-Engine schnelle Abfragen.

Sie müssen sich keine Sorgen um den Overhead oder die Anwendungsleistung machen, da die Sampling-Profiling-Technologie die Leistung nicht beeinträchtigt. Pyroscope speichert Ihre Profiling-Daten effizient. Dies macht es kostengünstig, auch wenn Sie unterschiedliche Profiling-Daten aus verschiedenen Anwendungen über Jahre hinweg speichern möchten.

Es funktioniert unter macOS, Linux und Docker und unterstützt Programme, die in Python, Go und Ruby geschrieben wurden.

Bubbleprof

Bubbleprof von Clinic.js bietet eine neue und einzigartige Möglichkeit, Ihre in Node.js geschriebene Software zu profilieren. Es verwendet eine „Bubble“-Benutzeroberfläche, die jedem, vom Experten bis zum Anfänger, hilft, die asynchrone Zeit in Ihrer App zu verstehen.

Es visualisiert, wie Ihre Node.js-Prozesse funktionieren, indem es ihre asynchronen Operationen beobachtet, sie gruppiert, die Verzögerungen berechnet und sie grafisch darstellt.

Bubbleprof bestimmt die Operationszeiten, indem es die Größe der Blasen innerhalb einer bestimmten Gruppe von Operationen betrachtet, die Ihr Code, ein Node-Kern oder ein Modul sein können. Es fügt auch benachbarte Gruppen zusammen, um die Komplexität zu reduzieren.

Um Verzögerungen zu berechnen, die beim Übergang von einer Gruppe zur nächsten auftreten, misst Bubbleprof die Länge der Pfeile, die die Blasen verbinden. Außerdem werden verschiedene Farben verwendet, um die einzelnen Prozesse zu kennzeichnen. Die inneren farbigen Linien zeigen zudem die verschiedenen Arten von asynchronen Operationen an, die für die Verzögerung verantwortlich sind.

Pyinstrument

Optimieren Sie Ihren Python-Code mit Pyinstrument.

Es zeigt Ihnen, warum Ihr Python-Code langsam ist und hilft Ihnen, die Probleme zu diagnostizieren, um blitzschnelle Leistung zu erzielen.

Um Pyinstrument zu verwenden, müssen Sie kein Python-Skript schreiben. Rufen Sie Pyinstrument einfach direkt von der Befehlszeile aus auf. Ihr Skript wird wie gewohnt ausgeführt, und das Tool liefert eine farbige Zusammenfassung der Bereiche, in denen die Anwendung Zeit verbracht hat. Es gibt auch eine Python-API, die den Prozess noch einfacher macht.

Sie haben die Möglichkeit, Webanfragen in Flask und Django zu profilieren, wofür detaillierte Dokumentationen bereitgestellt werden. Beachten Sie, dass Pyinstrument ein statistisches Profiling verwendet, bei dem alle 1 ms der Aufrufstapel aufgezeichnet wird, anstatt jeden einzelnen Funktionsaufruf Ihres Programms zu verfolgen.

Dies ist vorteilhaft, da statistische Profiler im Vergleich zu Tracing-Profilern einen geringeren Overhead verursachen. Da der gesamte Stapel aufgezeichnet wird, wird das Auffinden teurer Funktionsaufrufe vereinfacht. Außerdem blendet Pyinstrument (standardmäßig) Bibliotheks-Frames aus, sodass Sie sich auf die Anwendungen oder Module konzentrieren können, die für Leistungsprobleme verantwortlich sind.

Die Fehlersuche bei Leistungsproblemen wird durch Pyinstrument vereinfacht, da es die Zeit in Bezug auf die „Wall-Clock“-Zeit aufzeichnet. Das Tool erfasst die gesamte Zeit des Programms, um Dateien zu lesen, Daten herunterzuladen, mit einer Datenbank zu kommunizieren usw.

Xdebug

Um die Leistungsprobleme in Ihrem Code zu beheben und Ihre Entwicklungserfahrung zu verbessern, bietet Xdebug umfangreiche Profiling- und Debugging-Funktionen.

Es ist eine PHP-Erweiterung, mit der Sie Engpässe in Ihrer PHP-Anwendung finden und deren Leistung mithilfe externer Visualisierungstools analysieren können, um Leistungsdiagramme zu erstellen.

Xdebug generiert eine detaillierte Ausgabe, die den Pfad der Anwendung bis zum Auftreten eines Fehlers aufzeigt, einschließlich der Parameter, die an eine bestimmte Funktion übergeben wurden. Dies dient dazu, Fehler zu verfolgen. Um Entwicklern das Verständnis zu erleichtern, werden farbcodierte Informationen zusammen mit strukturierten Ansichten generiert.

Es wird auch mit einem Remote-Debugger geliefert, mit dem Sie Xdebug mit einem laufenden Code, einer IDE oder einem Browser verbinden können, um Code-Haltepunkte anzuzeigen und den Code Zeile für Zeile auszuführen. Eine weitere Funktion ist die Codeabdeckung, die anzeigt, wie viel Code Ihres Programms ausgeführt wurde, und die auch bei Komponententests hilft.

SPX

Simple Profiling eXtension (SPX) ist eine Profiling-Erweiterung für PHP. Es verfügt über einzigartige Eigenschaften, die es von anderen Profiling-Erweiterungen unterscheiden. Die Nutzung ist völlig KOSTENLOS und auf Ihre Infrastruktur beschränkt, sodass kein Risiko von Datenlecks besteht.

Die Einfachheit von SPX macht es sehr benutzerfreundlich: Sie müssen lediglich eine Befehlszeile oder eine Umgebungsvariable festlegen, um ein Skript zu profilieren. Alternativ können Sie auch das Kontrollkästchen auf einer Webseite aktivieren, um das Skript zu profilieren. Daher müssen Sie Ihren Code nicht manuell instrumentieren.

Es unterstützt auch die laufende Befehlszeilenskriptausführung – Strg-C. Darüber hinaus macht dieser Prozess die Verwendung eines Befehlszeilen-Launchers oder einer dedizierten Browsererweiterung überflüssig. SPX unterstützt zahlreiche Metriken, etwa 22, darunter verschiedene Zeit- und Speichermetriken, Objekte, verwendete Dateien, E/A usw.

Es kann Daten sammeln, ohne den Kontext zu verlassen. Die Web-Benutzeroberfläche ermöglicht die Konfiguration/Aktivierung des Profilings für die aktuelle Browsersitzung und listet alle profilierten Skriptdetails und Berichte auf. Über die Web-Benutzeroberfläche können Sie einen bestimmten Bericht für eine detailliertere Analyse auswählen. Sie bietet einige interaktive Visualisierungen wie Flame Graph, Flat Profile und Timeline, die auf Millionen von Funktionsaufrufen skaliert werden können.

Prefix

Prefix von Stackify ist ein einfach zu installierender und leichtgewichtiger Code-Profiler, der von vielen Entwicklern geschätzt wird. Es hilft Ihnen, Engpässe in der Anwendungsleistung zu beseitigen, um sie zu optimieren und die Benutzererfahrung zu verbessern.

Die hervorragenden Tracing- und Profiling-Funktionen von Prefix ermöglichen es Ihnen, versteckte Ausnahmen, langsame SQL-Abfragen und mehr schnell zu finden. Es bietet Entwicklern die Leistungsfähigkeit von APM (Application Performance Monitoring). Prefix validiert die Codeleistung während der Entwicklung und ermöglicht es Ihnen, leistungsstärkeren Code zu testen.

Dies reduziert Support-Tickets aus der Produktion und hilft Entwicklungsmanagern, ihre Ziele schneller zu erreichen. Entdecken Sie leistungsschwache Abfragen, unbekannte Engpässe und von ORM generierte Abfragen.

Sie können auch jeden SQL-Aufrufparameter verfolgen, die Zeitangaben herunterladen und die betroffenen Datensätze einsehen. Prefix erleichtert auch das Erkennen von N+1-Mustern. Vergessen Sie das Durchsuchen unübersichtlicher Protokolle; führen Sie sie zusammen, um Probleme einfach zu lokalisieren.

Mit Prefix können Sie den Kontext eines verdächtigen Protokolls direkt in einer Abfrageanforderung finden und mühelos von einem Protokoll zu einer Ablaufverfolgung springen, um Fehler zu beheben. Prefix beleuchtet auch schlecht performante Abhängigkeiten, die nützlich sind, um versteckte Ausnahmen zu finden und mit Legacy-Code oder Framework-Bereichen zu arbeiten. Diese Abhängigkeiten können Webdienste, Dienste von Drittanbietern, Cache-Dienste und andere sein.

Prefix funktioniert unter Windows und Mac und unterstützt .Net, Ruby, Java, PHP, Python und Node.js.

Scalene

Scalene ist ein hochpräziser und leistungsstarker GPU-, CPU- und Speicher-Profiler für Python-basierte Programme. Es bietet mehrere Vorteile gegenüber anderen Profilern, z. B. die schnellere Ausführung von Jobs und die Bereitstellung detaillierterer Informationen.

Scalene ist sehr schnell und nutzt Sampling anstelle von Instrumentierung. Es ist auch nicht auf die Tracing-Funktionen von Python angewiesen. Darüber hinaus liegt der Overhead in der Regel unter 10-20 %. Dieses Tool führt Software-Profiling auf Zeilenebene durch und zeigt die Codezeilen an, die für die Ausführungszeit Ihres Programms verantwortlich sind.

Diese Details sind wertvoller als das Profiling auf Funktionsebene. Scalene trennt die reine Python-Zeit von der Zeit, die für nativen Code, einschließlich Bibliotheken, aufgewendet wird. Da die meisten Python-Programmierer die Leistung von nativem Code nicht optimieren, können sich Entwickler auf die Optimierung von Code konzentrieren, den sie tatsächlich verbessern können.

Es hebt Hotspots rot hervor, was das Erkennen von CPU-Zeit/Speicherzuweisung erleichtert und die Systemzeit einfach trennt, um E/A-Probleme zu identifizieren. Scalene kann die GPU-Zeit melden, die Speichernutzung profilieren und die CPU-Nutzung verfolgen. Es kann auch potenzielle Speicherlecks identifizieren, das Kopiervolumen profilieren und reduzierte Profile für Codezeilen generieren, die mehr als 1 % der CPU verbrauchen.

VisualVM

Das All-in-One-Tool zur Fehlerbehebung für Java, VisualVM, wurde für die Produktions- und Entwicklungsphase entwickelt. Es ist eine visuelle Software, die leichtgewichtige Profiling-Funktionen und JDK-Befehlszeilentools integriert.

VisualVM überwacht Anwendungen, die unter Java 1.4+ laufen, und behebt Probleme mithilfe verschiedener Technologien wie JMX, jvmstat, Attach API und Serviceability Agent. Dieses Tool eignet sich perfekt für die unterschiedlichen Anforderungen von Qualitätssicherungsingenieuren, Systemadministratoren und Endbenutzern.

Es erkennt automatisch Java-basierte Anwendungen, die remote und lokal ausgeführt werden, und listet sie auf. Das Tool ermöglicht es Ihnen auch, Programme manuell über eine JMX-Verbindung zu definieren. Für jeden Prozess werden typische Laufzeitdaten wie PID, übergebene Argumente, JDK-Home, Hauptklasse, JVM-Flags, JVM-Version sowie System- und Argumenteigenschaften angezeigt.

VisualVM überwacht die CPU-Auslastung, Heap und Metaspace oder den permanenten Generierungsspeicher, die laufenden Threads und die geladenen Klassen einer Anwendung. Es zeigt alle laufenden Threads in einer Zeitleiste mit zusammengefassten Ruhe-, Lauf-, Park-, Überwachungs- und Wartezeiten an.

Sowohl Instrumentierungs- als auch Sampling-Profiler können mit VisualVM für das Speichermanagement und die Anwendungsleistung ausgeführt werden. Es zeigt Thread-Dumps an, um einen schnellen Einblick in Prozesse zu erhalten. Es zeigt auch .hprof-Snapshots an und erstellt sie bei Bedarf, um Heap-Nutzungsprobleme aufzudecken und Speicherlecks zu debuggen.

Darüber hinaus kann VisualVM grundlegende Daten eines abgestürzten Java-basierten Prozesses zusammen mit seiner Umgebung einlesen. Sie können Ihre Apps offline analysieren. Es kann die App-Laufzeitumgebung und -Konfiguration mit erstellten Heap-Dumps, Thread-Dumps und Profiling-Snapshots speichern, die Sie zu einem späteren Zeitpunkt offline verarbeiten können.

Es funktioniert unter Windows, Linux und Unix.

Orbit Profiler

Visualisieren Sie Ihre C/C++-Anwendung und beheben Sie schnell Leistungsprobleme mit dem Orbit Profiler. Dies ist ein Debugging-Tool und ein eigenständiger Profiler, der Entwicklern helfen soll, den Ausführungsablauf komplexer Anwendungen anzuzeigen und zu verstehen.

Er bietet einen detaillierten Überblick über alle Vorgänge in der App, sodass Sie Leistungsprobleme schnell beseitigen und die hohe Leistung Ihrer Anwendung wiederherstellen können.

Der Orbit Profiler kann effizient mit jeder C- oder C++-Anwendung arbeiten, vorausgesetzt, er kann auf die PDB-Datei zugreifen. Dann beginnt er mit dem Profiling, sobald Sie das Programm heruntergeladen haben. Das Tool springt zum Zielprozess, hängt sich an ausgewählte Funktionen an und führt ein Profiling durch.

Es kann auch mit Ihren optimierten endgültigen oder Versand-Builds arbeiten. Neben dynamischer Instrumentierung bietet der Orbit Profiler auch „Always-On“-Sampling-Funktionen, die schnell, jederzeit verfügbar und zuverlässig sind.

Es funktioniert unter Windows und Linux.

Uber JVM Profiler

Ausgestattet mit erweiterten Profiling-Funktionen ist der Uber JVM Profiler eine weitere gute Option für Ihre Java-basierten Anwendungen.

Er bietet einen Java-Agenten, der mehrere Stack-Traces und Metriken für Spark/Hadoop-JVM-Prozesse in verteilter Weise sammelt, wie z. B. Speicher-, CPU- und E/A-Metriken.

Das Tool kann Java-Argumente und -Methoden im Benutzercode verfolgen, ohne diesen zu ändern. Sie können es auch verwenden, um die Anruflatenz von HDFS-Namensknoten für alle Spark-Anwendungen zu verfolgen und Probleme zu beheben. Es kann sogar die HDFS-Dateipfade der Spark-Anwendung verfolgen, um „heiße“ Dateien zu identifizieren und weitere Optimierungen durchzuführen.

Der Uber JVM Profiler wurde ursprünglich entwickelt, um Spark-Anwendungen zu profilieren, die in der Regel viele Maschinen oder Prozesse für eine Anwendung umfassen. Daher können Anwender Metriken für diese Maschinen oder Prozesse problemlos korrelieren.

Das Tool arbeitet jedoch wie ein typischer Java-Agent, sodass Sie es für alle Ihre JVM-Prozesse verwenden können. Seine Funktionen umfassen:

  • Debuggen der Speichernutzung von Spark-App-Executors, wie z. B. Java-Heap-Speicher, nativer Speicher, Nicht-Heap-Speicher, Pufferpool und Speicherpool
  • Debuggen der CPU-Auslastung und Garbage-Collection-Zeit
  • Debuggen von Java-Klassenmethoden hinsichtlich ihrer Häufigkeit, Zeit oder Dauerprofilierung
  • Argument-Profiling (Debuggen und Verfolgen von Java-Klassenmethodenaufrufen und deren Argumentwerten)
  • Stack-Trace-Profiling und Erstellung von Flame Graphs für die CPU-Zeit
  • Debuggen von E/A-Metriken und JVM-Thread-Metriken

Tracy

Tracy ist ein nützliches Tool, das Entwicklern beim einfachen Debuggen von PHP-Programmen hilft. Es verfügt über ein benutzerfreundliches Design und erweiterte Funktionen wie CLI-Unterstützung, Debugging von AJAX-Aufrufen und mehr.

Es kann Fehler schnell finden und beheben, Variablen ausgeben, Fehler protokollieren, den Speicherverbrauch visualisieren und die Ausführungszeit von Abfragen oder Skripten bestimmen. Durch die Verwendung von Farbcodierungen und das Hervorheben von Problemen in Rot mit klaren Erklärungen lassen sich Ausnahmen und Fehler leicht visualisieren und verstehen.

Tracy verfügt über eine Protokollierungsfunktion und eine automatische Umgebungserkennung. Es speichert Daten in Protokolldateien und zeigt Besuchern während Ausfallzeiten Serverfehlermeldungen an. Tracy kann auch in Drupal 7, OpenCart, WordPress und mehr integriert werden.

vprof

vprof ist ein visueller Profiler für Python-Anwendungen. Es bietet umfangreiche, interaktive Visualisierungen für die verschiedenen Eigenschaften Ihres Python-Programms, wie z. B. Speichernutzung und Laufzeit.

Es ist unter einer BSD-Lizenz verfügbar und unterstützt Python 3.4 und höher.

Fazit

Die Anwendungsleistung ist ein entscheidender Faktor, um die Erwartungen der Endbenutzer zu erfüllen. Wenn Leistungsprobleme auftreten, müssen Sie bereit sein, das Problem zu diagnostizieren, bevor es die Endbenutzererfahrung beeinträchtigt.

Optimieren Sie Ihre Anwendungen daher kontinuierlich und beheben Sie Probleme sofort, um den Benutzern weiterhin eine superschnelle Anwendungsleistung mit den in diesem Artikel vorgestellten Tools zu ermöglichen.

Hier ist eine kurze Vergleichstabelle, die die oben genannten Profiler und ihre Hauptanwendungsbereiche zeigt:

Name Sprachen
spy Python
Pyroscope Python, Ruby, Go
Bubbleprof Node.js
Pyinstrument Python
Xdebug PHP
SPX PHP
Prefix Python, .NET, Java, Node.js, Ruby, PHP
Scalene Python
VisualVM Java
Orbit Profiler C, C++
Uber JVM Profiler Java
Tracy PHP
vprof Python