Technologieaustausch

Analyse der Prinzipien von Tools zur Erfassung der Leistung mobiler Anwendungen

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Übersicht über Tools zur Leistungserfassung und -analyse

Es gibt viele Tools zum Sammeln, Analysieren und Anzeigen von Leistungsdaten mobiler Anwendungen, die grob in die folgenden Kategorien unterteilt werden können. Zum Beispiel mobile Leistungstools, die mehrere Leistungsindikatoren erfassen können, Perfdog und Solopi, darunter Solopi als Open Source und Pefdog als kommerzielles Tool. Tools, die Absturzanalysen durchführen können, wie etwa das kommerzielle Firebase Crashlytics und das Open-Source-Tool Sentry. Wenn Sie netzwerkbezogene Daten analysieren müssen, können Sie Charles oder Wireshark verwenden. Darüber hinaus gibt es umfassende Performance-Management-Tools wie Dynatrace. Im Allgemeinen sind die Fähigkeiten, die Genauigkeit und die Benutzererfahrung kommerzieller Tools definitiv besser als Open-Source-Tools. Als persönliche Studie und Forschung kann ich nur mit Open-Source-Tools beginnen. Daher werden wir beim Schreiben dieses Blogs auch Open-Source-Tools als Beispiele verwenden.

Tool zum Testen der mobilen Leistung
PerfDog: Ein Tool zur Überwachung der Anwendungsleistung, der CPU, des Speichers, des Stromverbrauchs und anderer Daten, das Leistungstests und Echtzeitüberwachung mobiler Anwendungen unterstützt.
Solopi: konzentriert sich auf das Testen und Überwachen der Leistung mobiler Anwendungen, einschließlich der Echtzeitüberwachung von Bildrate, CPU, Speicher und anderen Indikatoren.

Crash-Analysetool
Firebase Crashlytics: Ein leistungsstarkes Absturzberichts- und Analysetool von Google, das Anwendungsabstürze in Echtzeit überwachen kann.
Sentry: Ein Open-Source-Fehlerverfolgungstool, das mehrere Plattformen unterstützt, einschließlich Fehlerberichten und Leistungsüberwachung mobiler Anwendungen.

Tools zum Testen der Netzwerkleistung
Charles Proxy: Ein Netzwerk-Debugging-Proxy-Tool, das Netzwerkanforderungs- und Antwortdaten für mobile Anwendungen erfasst und analysiert.
Wireshark: Ein Open-Source-Netzwerkanalysetool, das die Erfassung und Analyse von Netzwerkpaketen mobiler Anwendungen unterstützt.

APM-Tools(Anwendungsleistungsmanagement):
Dynatrace: Eine cloudnative Full-Stack-Lösung zur Leistungsüberwachung, die die Leistungsüberwachung mobiler Anwendungen und die Analyse der Benutzererfahrung unterstützt.

Welche Leistungskennzahlen werden erfasst und wie

  Bevor Sie eine Leistungsanalyse durchführen, müssen Sie zunächst die Bedeutung der einzelnen Leistungsindikatoren verstehen. Am Beispiel der von Solopi gesammelten Leistungsindikatoren werfen wir einen Blick auf gängige Indikatoren für die Leistung mobiler Anwendungen und wie diese Indikatoren erfasst werden können.

Bildrate

Die Formel zur Berechnung der Bildrate lautet:Bildrate = Anzahl der gezeichneten Bilder/Zeitraum,Die Zielbildrate für die meisten Anwendungs- und Spieleentwickler ist60 FPS( Bilder/Sekunde), warum beträgt die Zielbildrate 60 FPS? Da die Bildschirmaktualisierungsrate der meisten modernen Smartphones und Tablets 60 Hz beträgt, sind die visuellen Effekte des Benutzers flüssiger und es treten keine Verzögerungen auf, solange die Bildrate 60 FPS erreicht, d. h. die Anzahl der pro Sekunde gezeichneten Bilder beträgt 60. Der Mindestwert darf nicht unter 30 FPS liegen. Dies liegt daran, dass der Monitor wiederholt das Bild des vorherigen Bildes anzeigt, während er auf ein neues Bild wartet, wodurch das Bild ungleichmäßig wird. Hohe Werte können 90 FPS erreichen (z. B. für Geräte mit hohen Bildwiederholraten).

So sammeln Sie Bildrateninformationen

  Es gibt zwei Möglichkeiten, die Bildrate zu erfassen. Eine besteht darin, die Bildratenstatistik mit der Choreographer-Klasse zu erfassen. Dies erfordert das Schreiben von Code innerhalb der Anwendung und kann nur die Bildrateninformationen der Anwendung erfassen.Eine andere Möglichkeit ist die Verwendung gfxinfo-Tool. Am Beispiel von Solopi wird die Timeout-Frame-Zeit innerhalb von 1 Sekunde auch über die Informationen des gfxinfo-Tools berechnet und die tatsächliche Frame-Rate abgeleitet. Daher wird ein Teil der Frame-Rate möglicherweise falsch angezeigt, wenn sie nahezu stationär ist. Es wird empfohlen, Bildratentests in dynamischen Szenarien wie Sliding oder Seitenwechsel durchzuführen. Die gfxinfo-Methode kann Bildrateninformationen aller Anwendungen sammeln und eignet sich sehr gut als Tool zur Leistungsdatenerfassung. Daher konzentrieren wir uns hier auch auf die Erfassung von Bildrateninformationen über gfxinfo.

Es gibt zwei Hauptschritte zum Sammeln von Bildrateninformationen.Schritt eins: Erhalten Sie gfxinfo-Informationen über den adb-Befehl.Schritt 2 : Analysieren Sie die Informationen und berechnen Sie die Bildrateninformationen. Der Inhalt der gfxinfo-Informationen ist ungefähr wie folgt:

Statistiken seit: Startzeit der Statistik, Einheit ist Nanosekunden.
Gesamtzahl der gerenderten Frames: Gesamtzahl der gerenderten Frames.
Janky Frames: Die Anzahl der Janky Frames, d. h. die Anzahl der Frames, die 16 ms überschreiten (Aktualisierungsintervall 60 Frames pro Sekunde).
Prozentsatz der Janky-Frames: Das Verhältnis der Janky-Frames zur Gesamtzahl der Frames.
90. Perzentil: 90. Perzentil, das angibt, dass 90 % der Frames eine Renderzeit haben, die unter diesem Wert (in Millisekunden) liegt.
95. Perzentil: 95. Perzentil, das angibt, dass 95 % der Frames eine Renderzeit haben, die unter diesem Wert (in Millisekunden) liegt.
99. Perzentil: 99. Perzentil, das angibt, dass 99 % der Frames eine Renderzeit haben, die unter diesem Wert (in Millisekunden) liegt.
Anzahl verpasster Vsync: Die Anzahl der nicht synchronisierten vertikalen Synchronisierungen, d. h. die Anzahl der Bildverluste, die durch nicht rechtzeitiges Rendern verursacht werden.
Anzahl Hohe Eingabelatenz: Die Anzahl der hohen Eingabeverzögerungen gibt die Anzahl der Verzögerungen an, die durch eine zu lange Verarbeitungszeit des Eingabeereignisses verursacht werden.
Anzahl langsamer UI-Threads: Die Häufigkeit, mit der der UI-Thread langsam reagierte, d. h. die Häufigkeit, mit der die Verarbeitung des UI-Threads zu lange dauerte.

Am Beispiel von Solopi wird die Framerate durch die Timeout-Frame-Zeit in den gfxinfo-Informationen abgeleitet. Den Code des jeweiligen Projekts können Sie im Solopi-Quellcode einsehen.

Verzögerungsrate/Anzahl der Verzögerungen

Anzahl der Einfrierungen : Während des Testzeitraums die Anzahl der Zeiträume, in denen festgestellt wird, dass die Bildrate unter dem Schwellenwert liegt. Immer wenn die Bildrate für einen bestimmten Zeitraum unter den Schwellenwert fällt, wird dies als Stottern gewertet. Der Schwellenwert kann hier angepasst werden. Wenn er beispielsweise 60 FPS niedriger als die Zielbildrate ist, kann er als Standbild aufgezeichnet werden. Das heißt, wenn die Frame-Rendering-Zeit mehr als 16 ms beträgt, wird es als hängengeblieben berechnet.

Verzögerungsrate : Der Prozentsatz der Gefrierzeit an der gesamten Testzeit. Angenommen, in einem Test wurde die Anwendung 120 Sekunden lang ausgeführt, wobei die Bildrate insgesamt viermal unter 16 FPS lag und die Gesamtverzögerungszeit 8 Sekunden betrug. Dann beträgt die Anzahl der Verzögerungen viermal. Stotterrate: 8/120*100 %=6,7 %. In der gfxinfo oben finden Sie auch Dateninformationen zur Lag-Rate.

CPU/Speicher

  Am Beispiel von Solopi umfasst die CPU den Prozentsatz der CPU-Auslastung des Prozesses, in dem sich die Aktivität der obersten Ebene befindet, und den Prozentsatz der globalen CPU-Auslastung. Bei Einzelprozessanwendungen stellen diese Daten die CPU-Auslastung der Anwendung dar Bei Multiprozess-Prozessanwendungen stellen diese Daten die CPU-Auslastung des UI-Prozesses der obersten Ebene dar. Wenn ein Prozesswechsel auftritt, kann Soloπ automatisch auf neue Prozessdaten umschalten.

Am Beispiel von Solopi umfasst der Speicher den PSS-Speicher (Proportional Set Size, also den tatsächlich verwendeten Speicher) des Prozesses, in dem sich die Aktivität der obersten Ebene der Anwendung befindet, den privaten Dirty-Speicher (privater Speicher) und den global belegten Speicher Bei Einzelprozessanwendungen stellen diese Daten die Speicherbelegung dar. Bei Mehrprozessanwendungen wie der CPU unterstützt Soloπ auch die automatische Umschaltung von Prozessen der obersten Ebene.
Wie zählt man CPU- und Speicherinformationen?
  Es gibt zwei Möglichkeiten, CPU- und Speicherinformationen zu zählen: Methode 1: Direktes Lesen von /proc/.<pid> /stat-Datei, um die CPU-Zeit des Prozesses zu erhalten, oder lesen Sie /proc/ direkt<pid> Die Datei /statm ruft Speicherstatistiken für einen Prozess ab. Methode 2: Informationen zur Speicher- und CPU-Nutzung über den adb-Shell-Befehl abrufen. Am Beispiel von Android-Geräten wurde die Möglichkeit zum direkten Lesen von Dateien geschlossen. Daher wird normalerweise der Befehl adb verwendet, um Speicher- und CPU-Informationen abzurufen.
Nachfolgend finden Sie einen Beispielcode zum Abrufen von Informationen zur Speichernutzung über den Befehl adb. Stellen Sie beim Ausführen des adb-Befehls sicher, dass adb über Root-Berechtigungen verfügt. Sie können den Befehl adb root verwenden, um dem ADB-Daemon Root-Rechte zu verleihen.
  1. import subprocess
  2. def get_memory_info(pid):
  3. try:
  4. # Run adb shell command to read /proc/<pid>/statm
  5. command = f"adb shell cat /proc/{pid}/statm"
  6. result = subprocess.check_output(command, shell=True)
  7. statm_data = result.decode('utf-8').strip().split()
  8. # Parse statm data
  9. size, resident, shared, text, lib, data, dt = map(int, statm_data)
  10. memory_info = {
  11. 'size': size, # total program size (pages)
  12. 'resident': resident, # resident set size (pages)
  13. 'shared': shared, # shared pages (pages)
  14. 'text': text, # text (code) size (pages)
  15. 'lib': lib, # library (unused since Linux 2.6; always 0)
  16. 'data': data, # data + stack (pages)
  17. 'dt': dt # dirty pages (unused since Linux 2.6; always 0)
  18. }
  19. return memory_info
  20. except subprocess.CalledProcessError as e:
  21. print(f"Error executing command: {e}")
  22. return None
  23. except Exception as e:
  24. print(f"Error: {e}")
  25. return None
  26. # Replace with your application's PID
  27. pid = '12345'
  28. memory_info = get_memory_info(pid)
  29. if memory_info:
  30. print(f"Memory info for PID {pid}:")
  31. print(f"Size: {memory_info['size']} pages")
  32. print(f"Resident set size (RSS): {memory_info['resident']} pages")
  33. print(f"Shared pages: {memory_info['shared']} pages")
  34. print(f"Text (code) size: {memory_info['text']} pages")
  35. print(f"Data + stack size: {memory_info['data']} pages")

Netzwerk

Nehmen wir als Beispiel Solopi, das Netzwerk Einschließlich der Upstream- und Downstream-Raten der Anwendung und des kumulierten Datenverkehrs sowie der globalen Upstream- und Downstream-Raten und des kumulierten Datenverkehrs. Es gehört zu den Anwendungsdimensionsdaten. Die spezifischen Daten sind in der folgenden Abbildung dargestellt:

Wie erhalte ich Netzwerkdaten?

Das Abrufen von Netzwerkdaten entspricht dem Abrufen von CPU-/Speicherdaten und kann direkt gelesen werden Rufen Sie Netzwerkdaten aus der Datei /proc/pid/net/dev ab oder rufen Sie sie über den Befehl adb ab (Befehl: adb shell cat /proc/pid/net/dev). Das Bild unten ist Teil des Solopi-Quellcodes. Sie können sehen, dass die Netzwerkdaten von wlan0 hier gezählt werden. Für eine spezifische Logik können Sie den NetworkTools.java-Code unter dem Solopi-Quellcode überprüfen. Was die Netzwerkverkehrsstatistik betrifft, wurden natürlich auch Fehler online gemeldet, da grep wlan0 hier nur den Netzwerk-WLAN-Verkehr zählt, nicht den mobilen Verkehr. Einzelheiten zu Fehlern finden Sie unterHier

Reaktionszeit

  Nehmen wir Solopi als Beispiel, Enthält Reaktionszeit- und Aktualisierungszeitdaten für Anwendungsklicks. Gehört zu Anwendungsdimensionsdaten. Die Zeit vom Klick des Benutzers bis zum ersten Mal, wenn das System eine Schnittstellenaktualisierung ausgibt, ist die Reaktionszeit, und die Zeit, bis das System die Aktualisierung der Schnittstelle stoppt, ist die Aktualisierungszeit. Die Logik zum Zählen der Reaktionszeit besteht darin, die Bildschirmaufzeichnung in Frames zu unterteilen. Wenn Sie Solopi tatsächlich verwenden, werden das Start-Frame und das End-Frame automatisch erkannt Die Antwortzeit ist beispielsweise nicht korrekt, wenn der Benutzer auf „Start“ klickt. Wenn Sie auf die Anwendungsseite klicken, wird die Handgeschwindigkeits-Bedienzeit einer Person in der Mitte berücksichtigt und dieser Teil wird in die Antwortzeit eingerechnet. Wenn Sie daher die Reaktionszeit der vorbereiteten Seite berechnen möchten, ist es genauer, nur den Bildschirm aufzuzeichnen und die Start- und Endframes der Seite manuell zu identifizieren. Die spezifischen Schritte zum Aufzeichnen von Bildschirmbildern sind wie folgt:

Das Obige ist ein Verständnis der Bedeutung allgemeiner Leistungsindikatoren in mobilen Anwendungen sowie detaillierte Anweisungen zu deren Erfassung. Was Abstürze usw. betrifft, werden wir sie in einem späteren Blog ausführlich vorstellen.