實現 storaged

Android O 增加了對storaged的​​支持,這是一個在 Android 設備上收集和發布存儲指標的 Android 原生守護程序。

  • 對於日常的 diskstats, 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 使用情況。

Diskstat(包括停滯的 diskstats)和 eMMC 信息被記錄到 Android 事件日誌中,平台簽入服務會在其中收集日誌。

storaged操作會自動發生並完全由 Android 框架處理,因此您無需執行任何實現工作。本頁描述了storaged的​​設計(包括新接口)以及如何使用它從內核獲取 I/O 狀態。

存儲設計

為了計費和權限的靈活性, storaged被實現為一個內核模塊,它返回每個 uid 的 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 使用情況,請使用帶-u選項的storaged命令。

命令: 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