Android 8 では、Android ネイティブ デーモンである storaged
のサポートが追加されています。このデーモンは、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 の設計
アカウントと権限の柔軟性を維持するために、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 使用量をダンプするには、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