storaged implementieren

Android 8 unterstützt storaged, einen nativen Android-Daemon, der Speichermesswerte auf Android-Geräten erfasst und veröffentlicht.

  • Für tägliche „diskstats“-Daten 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 wird storaged /d/mmc0/mmc0:001/ext_csd (falls verfügbar) geparst.
  • Bei der Zuordnung von App-I/O-Problemen durchsucht storaged regelmäßig /proc/uid_io/stats und verwaltet geparste Daten, einschließlich Daten aus allen Apps (nicht nur aus laufenden Apps). dumpsys kann storaged aufrufen, um die I/O-Nutzung der App in einem Fehlerbericht zu protokollieren.

Diskstat-Informationen (einschließlich steckengebliebener Diskstat-Informationen) und eMMC-Informationen werden im Android-Ereignisprotokoll protokolliert, wo sie von einem Plattform-Check-in-Dienst erfasst werden.

storaged-Vorgänge erfolgen automatisch und werden vollständig vom Android-Framework verwaltet. Sie müssen also keine Implementierungsarbeit leisten. Auf dieser Seite wird das Design von storaged (einschließlich neuer Schnittstellen) beschrieben und wie Sie damit den E/A-Status vom Kernel abrufen.

Speicherdesign

Für mehr Flexibilität bei der Ressourcenerfassung und -zuweisung wird storaged als Kernelmodul implementiert, das E/A-Informationen pro Nutzer-ID zurückgibt (anstelle der Standard-proc/PID/io-Funktion). Roh-E/A-Daten für jede E/A-Anfrage werden weiterhin im Kernel task_struct gespeichert und aktualisiert. Der Kernel überwacht, wann ein Prozess beendet wird, damit keine E/A-Nutzung nach dem letzten storaged-Polling-Ereignis verpasst wird.

Das Modul liest Rohdaten und verarbeitet sie nur, wenn das Framework es über einen Wechsel der UID in den Vordergrund oder Hintergrund informiert oder 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 dem storaged-Daemon.

storaged führt die Schnittstelle /proc/uid_io/stats ein, die eine Liste der I/O-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-/Schreib-Byte“ sind E/A-Ereignisse von einem Speichergerät.
  • read/write chars (auch in Bytes) sind Daten, die von read/write-Systemaufrufen angefordert werden.

E/A-Status vom Kernel abrufen

Wenn Sie die I/O-Nutzung aus dem Kernel dumpen möchten, 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. Das 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