Как реализовать storaged

В Android 8 добавлена поддержка storaged – встроенного демона Android, который собирает и публикует показатели хранилища на устройствах 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 реализован как модуль ядра, который возвращает информацию о I/O для каждого UID (вместо использования стандартного proc/PID/io). Необработанные данные I/O для каждого запроса на ввод-вывод продолжают храниться и обновляться в ядре task_struct, и ядро отслеживает, когда процесс завершается, чтобы не пропустить использование I/O, которое происходит с момента последнего события опроса storaged.

Модуль считывает первичные данные и обрабатывает их только тогда, когда фреймворк уведомляет его о переключении UID на передний план или в фоновый режим или когда демон storaged запрашивает отчет. В этот момент модуль экспортирует узел файла из ядра для связи с фреймворком и демоном storaged.

storaged представляет интерфейс /proc/uid_io/stats, который возвращает список статистики ввода-вывода для каждого UID в системе. Формат:

<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 с устройства хранения данных.
  • read/write chars (также в байтах) – это данные, запрошенные системными вызовами read/write.

Получение статуса ввода-вывода от ядра

Чтобы создать дамп использования 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