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