Реализация хранимого

В Android O добавлена ​​поддержка storaged — собственного демона Android, который собирает и публикует показатели хранилища на устройствах Android.

  • Для ежедневной статистики диска 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 (включая остановленную информацию о дискете) и 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