實作儲存空間

Android 8 新增了對 storaged 的支援,這是 Android 原生 Daemon,可在 Android 裝置上收集及發布儲存空間指標。

  • 針對每日磁碟狀態,storaged 會定期剖析 /sys/block/mmcblk0/stat (eMMC 儲存裝置) 或 /sys/block/sda/stat (非 eMMC 裝置)。
  • 針對 eMMC 壽命,storaged 會剖析 /d/mmc0/mmc0:001/ext_csd (如有)。
  • 針對應用程式 I/O 歸咎,storaged 會定期遍歷 /proc/uid_io/stats,並維護已剖析的資料,包括來自所有應用程式 (而非僅限於執行中的應用程式) 的資料。dumpsys 可以呼叫 storaged,在錯誤報告中記錄應用程式 I/O 用量。

磁碟狀態 (包括停止的磁碟狀態) 和 eMMC 資訊會記錄到 Android 事件記錄檔,平台簽入服務會收集這些記錄。

storaged 作業會自動執行,且完全由 Android 架構處理,因此您不必執行任何實作工作。本頁說明 storaged 的設計 (包括新的介面),以及如何使用該設計從核心取得 I/O 狀態。

儲存設計

為了提供彈性的記錄和權限功能,storaged 會以核心模組的形式實作,以便傳回個別使用者 ID 的 I/O 資訊 (而非使用標準 proc/PID/io)。每個 I/O 要求的原始 I/O 資料會繼續儲存在核心 task_struct 中並進行更新,而核心會持續追蹤程序結束的時間,以免錯過上次 storaged 輪詢事件發生的 I/O 用量。

只有在架構通知模組關於 uid 的前景/背景切換,或是 storaged 守護程序要求報告時,模組才會讀取原始資料並加以處理。屆時,模組會從核心匯出檔案節點,以便與架構和 storaged 守護程序進行通訊。

storaged 會導入 /proc/uid_io/stats 介面,傳回系統中每個 UID 的 I/O 統計資料清單。格式如下:

<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>
  • 讀取/寫入位元組是儲存裝置的 I/O 事件。
  • 讀取/寫入字元 (也以位元組為單位) 是讀取/寫入系統呼叫要求的資料。

從核心取得 I/O 狀態

如要從核心傾印 I/O 用量,請使用 storaged 指令搭配 -u 選項。

指令:storaged -u

指令輸出格式:name/uid fg_rchar fg_wchar fg_rbytes fg_wbytes bg_rchar bg_wchar bg_rbytes bg_wbytes fg_fsync bg_fsync

注意:這個輸出結果與 proc/uid_io/stats 的輸出結果類似。這是因為 storaged 會處理 /proc/uid_io/stats 的資料,並產生自己的資料。

輸出內容範例:

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