В 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