storaged の実装

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 を定期的に走査し、解析されたデータを保持します。このデータには、実行中のアプリだけでなくすべてのアプリのデータが含まれます。dumpsysstoraged を呼び出すと、アプリ 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