Implementierung von storaged

Android O bietet Unterstützung für storaged , einen nativen Android-Daemon, der Speichermetriken auf Android-Geräten sammelt und veröffentlicht.

  • Für tägliche Diskstats analysiert storaged regelmäßig /sys/block/mmcblk0/stat (eMMC-Speichergeräte) oder /sys/block/sda/stat (Nicht-eMMC-Geräte).
  • Für die eMMC-Lebensdauer storaged /d/mmc0/mmc0:001/ext_csd (falls verfügbar).
  • Für die E/A-Beschuldigung von Anwendungen durchläuft storaged regelmäßig /proc/uid_io/stats und verwaltet geparste Daten, die Daten aus allen Anwendungen (nicht nur laufenden Anwendungen) umfassen. dumpsys kann storaged aufrufen, um die E/A-Nutzung der Anwendung in einem Fehlerbericht zu protokollieren.

Diskstat- (einschließlich blockierter Diskstats) und eMMC-Informationen werden im Android-Ereignisprotokoll protokolliert, wo ein Plattform-Check-in-Dienst die Protokolle sammelt.

storaged Vorgänge erfolgen automatisch und werden vollständig vom Android-Framework abgewickelt, sodass Sie keine Implementierungsarbeit leisten müssen. Diese Seite beschreibt das Design von storaged (einschließlich neuer Schnittstellen) und wie man es verwendet, um den I/O-Status vom Kernel abzurufen.

Aufbewahrungsdesign

Aus Gründen der Abrechnungs- und Berechtigungsflexibilität ist storaged als Kernelmodul implementiert, das I/O-Informationen pro UID zurückgibt (anstatt den Standard proc/PID/io zu verwenden). Rohe E/A-Daten für jede E/A-Anfrage werden weiterhin im Kernel task_struct gespeichert und aktualisiert, und der Kernel verfolgt, wann ein Prozess beendet wird, damit ihm die E/A-Nutzung, die seit dem letzten storaged Abfrageereignis auftritt, nicht entgeht.

Das Modul liest Rohdaten und verarbeitet sie nur, wenn das Framework es über einen UID-Vordergrund-/Hintergrundwechsel benachrichtigt oder wenn der storaged Daemon einen Bericht anfordert. Zu diesem Zeitpunkt exportiert das Modul einen Dateiknoten aus dem Kernel für die Kommunikation mit dem Framework und storaged Daemon.

storaged führt die Schnittstelle /proc/uid_io/stats ein, die eine Liste von E/A-Statistiken für jede UID im System zurückgibt. Das Format ist:

<uid>: <foreground read bytes> <foreground write bytes> <foreground read chars> <foreground write chars> <background read bytes> <background write bytes> <background read chars> <background write chars>
  • Lese-/Schreibbytes sind E/A-Ereignisse von einem Speichergerät.
  • Lese-/Schreibzeichen (auch in Bytes) sind Daten, die von Lese-/Schreib-Systemaufrufen angefordert werden.

I/O-Status vom Kernel abrufen

Um die E/A-Nutzung vom Kernel zu sichern, verwenden Sie den Befehl storaged mit der Option -u .

Befehl: storaged -u

Befehlsausgabeformat: name/uid fg_rchar fg_wchar fg_rbytes fg_wbytes bg_rchar bg_wchar bg_rbytes bg_wbytes fg_fsync bg_fsync

Hinweis: Diese Ausgabe ähnelt der Ausgabe für proc/uid_io/stats . Dies liegt daran, dass storaged Daten aus /proc/uid_io/stats verarbeitet und eigene Daten generiert.

Beispielausgabe:

com.google.android.backuptransport  2269  60  0  0  1719845663  143912573  149065728  184180736
com.android.vending  2170  60  0  0  219904796  38693092  174436352  18944000