Реализация хранилища

В 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 (если доступно).
  • Для обвинения ввода-вывода приложения storaged периодически просматривает /proc/uid_io/stats и поддерживает проанализированные данные, которые включают данные из всех приложений (а не только запущенных приложений). dumpsys может вызвать storaged , чтобы зарегистрировать использование ввода-вывода приложения в отчете об ошибке.

Информация о Diskstat (включая остановленную diskstat) и eMMC записывается в журнал событий Android, где служба проверки платформы собирает журналы.

storaged операции происходят автоматически и полностью обрабатываются платформой Android, поэтому вам не нужно выполнять какую-либо работу по реализации. Эта страница описывает дизайн storaged (включая новые интерфейсы) и то, как его использовать для получения состояния ввода-вывода от ядра.

хранимый дизайн

Для гибкости учета и разрешений storaged реализован в виде модуля ядра, который возвращает информацию о вводе-выводе для каждого uid (вместо использования стандартного proc/PID/io ). Необработанные данные ввода-вывода для каждого запроса ввода-вывода продолжают храниться и обновляться в ядре task_struct , и ядро ​​​​отслеживает, когда процесс завершается, чтобы не пропустить использование ввода-вывода, которое происходит из последнего 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>
  • байты чтения/записи — это события ввода-вывода с запоминающего устройства.
  • символы чтения/записи (также в байтах) — это данные, запрашиваемые системными вызовами чтения/записи.

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

Чтобы получить дамп использования ввода-вывода из ядра, используйте команду 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