| iorapd
Служба запуска приложений iorap Тип файла: служба Комментарии
I/O Read Ahead Process (IORap)
Ускоренный запуск приложений благодаря процессу упреждающего чтения ввода-вывода (IORap)
Google постоянно экспериментирует со способами повышения производительности Android. Одна из малоизвестных функций, добавленных в Android 10, называется Unspecialized App Process Pool (USAP). Эта функция исключает разветвление Zygote во время процесса запуска приложения, экономя примерно ~5 мс на средней скорости запуска приложения на устройстве Pixel 2. В настоящее время эта функция отключена по умолчанию в AOSP, и Google объясняет, что использование дополнительной памяти все еще требует тестирования. Однако что еще интереснее, так это новая функция, появившаяся в Android 11, под названием I/O Read Ahead Process (IORap). По данным Google, эта функция приведет к «более чем на 5% ускорению холодных запусков, а случаи-герои — на 20% быстрее». Эта функция «будет предварительно выбирать артефакты приложений (например, код и ресурсы) во время процесса запуска», чтобы повысить скорость запуска приложений.
Google также «внес улучшения в профили, используемые для оптимизации пути к загрузочному классу и образа системы», что улучшит производительность приложений и снизит затраты на память и хранилище, связанные с системными артефактами. Эти изменения в основном пойдут на пользу устройствам с большим объемом оперативной памяти, хотя Google не сказал, каков предел, при котором мы увидим наибольшую выгоду.
В Android 11 была представлена IORap — новая функция, которая значительно сокращает время запуска приложений.
IORap сокращает время запуска приложения, прогнозируя, какие операции ввода-вывода потребуются, и выполняя их заранее.
Многим приложениям при запуске требуется доступ к вводу-выводу.
Часто приложение запускается медленно из-за блокировки ввода-вывода.
После предварительной выборки данных приложение может получить доступ к данным из кэша страниц почти сразу, что значительно снижает задержку при запуске приложения.
[img=ioarp.jpg]
Система разделена на 6 процессов
1) system_server
Он в основном отвечает за мониторинг состояния приложения.
Когда статус изменяется или запускается задание, процесс iorapd уведомляется о необходимости основной обработки.
Мониторинг включает в себя: обновления ODEX, изменения хода запуска активности и службу заданий для запуска файлов трассировки компиляции iorapd. Давайте сосредоточимся здесь на службе заданий.
Служба заданий в Android — это обычная фоновая служба.
Для выполнения некоторых задач с низким приоритетом задача компиляции здесь также использует службу заданий и выполняется в состоянии зарядки, и делает это только в течение 24 часов.
2) ioarpd
Основная часть платформы обработки, iorap_impl.cc, в основном принимает вызовы интерфейса после изменения статуса приложения, отправленные system_server через связыватель, и добавляет мониторинг изменений пакетов.
iiorap_impl.cc — это конец определения мониторинга состояния, а event_manager — это конец обработки мониторинга состояния. Вся логика здесь. Включая DexOptEvent, packageChanged, appLaunchEvent, jobScheduleEvent.
Программная среда и структура кода Android iorap по-прежнему очень понятны.
Вы можете понять весь процесс на основе ключевых слов в структуре.
Например, производитель — это точка входа обработки perfetto трассировки.
3) traced
При первом запуске приложения через perfetto через appLaunchEvent будет генерироваться трассировка.
Эта трассировка записывает удаление/добавление страниц кэша страниц ядра (из ftrace).
Во время первых нескольких холодных запусков приложения будет выполняться перфетто-трассировка для получения событий промахов кэша страниц.
Исследования показывают, что накладные расходы на отслеживание perfetto при запуске незначительны.
После создания трассировки производитель perfetto будет уведомлен о необходимости записать ее и сохранить в файле perfetto_trace.pb.
4) iorap.cmd.compiler
Дочерний процесс возник из форка iorapd. На основе трассировок perfetto, полученных на предыдущих этапах, IORap генерирует список предварительной выборки во время простоя устройства.
По сути, список предварительной выборки содержит информацию о файле (имя, смещение, длину), к которой осуществляется доступ при запуске приложения.
IORap анализирует событие mm_pagemap из трассировки perfetto и преобразует его результат (инод по обратному пути, смещение, длина) в индексный дескриптор (имя, смещение, длина) в имя файла.
Затем данные сохраняются в списке предварительной выборки, который представляет собой файл protobuf.
5) iorap.inode2filename
Дочерний процесс, ответвленный от процесса компилятора , используется для анализа трассировки, преобразования индексного дескриптора в имя файла, сохранения его в protobuf и возврата компилятору для сохранения.
6) iorap.prefetcherd
Дочерний процесс из iorapd fork использует канал для связи, а read_ahead передает данные через sendCommand.
После нескольких предыдущих холодных запусков IoRap анализирует информацию о предварительной выборке приложения через компилятор.
Во время холодного запуска нового приложения запуск приложения используется в качестве условия триггера, и iorapd будет уведомлен о необходимости выполнить работу по предварительной выборке и передать ранее проанализированный protobuf для ввода prefetcherd и выполнять предварительную выборку на стороне ядра с помощью системных вызовов (таких как posix_fadvise).
Конфигурация, задействованная в iorap
Имя атрибута | Значение | Примечание
ro.iorapd.enable включить функцию iorap
iorapd.root.dir Корневой каталог, в котором создается файл pb. По умолчанию — /data/misc/iorapd.
iorapd.readahead.verbose_ipc Печатать ли подробные журналы уровня в процессе предварительной выборки По умолчанию — ложь
iorapd.readahead.strategy Стратегии предварительного чтения По умолчанию используется posix_fadvise.
iorapd.readahead.out_of_process Использовать ли предварительную выборку в процессе или ipc для предварительного чтения, true означает ipc По умолчанию верно
iorapd.readahead.minijail Загружать ли фильтрацию seccomp в процессе предварительной выборки По умолчанию верно
iorapd.readahead.enable включить упреждающее чтение По умолчанию верно
iorapd.readahead.dump_paths Сбрасывать ли содержимое protobuf в процессе предварительной выборки По умолчанию — ложь
iorapd.readahead.dump_all Сбрасывать ли содержимое protobuf в процессе предварительной выборки По умолчанию — ложь
iorapd.perfetto.trace_duration_ms Продолжительность сбора трассировки По умолчанию – 5 с.
iorapd.perfetto.max_traces Максимальное количество записей трассировки, лишние будут удалены. По умолчанию – 10.
iorapd.perfetto.enable включить трассировку коллекции perfetto По умолчанию верно
iorapd.perfetto.buffer_size Буфер сбора трассировки По умолчанию – 4 к.
iorapd.maintenance.min_traces При компиляции используется минимальное количество трасс перфетто. По умолчанию – 1.
iorapd.maintenance.compiler_timeout_ms компилировать таймаут По умолчанию – 10 минут.
iorapd.log.verbose Печатать ли подробные журналы уровня в iorapd По умолчанию установлено значение false, вы можете изменить NDEBUG в debug.h.
iorapd.forwarding_service.wtf_crash Используется ли прикладным уровнем, нужно ли ему генерировать исключение при возникновении исключения? По умолчанию — ложь
iorapd.db.location Путь, по которому БД хранится в iorapd По умолчанию — /data/misc/iorapd/sqlite.db.
iorapd.blacklist_packages Черный список, приложения из этого списка будут игнорироваться в iorapd. По умолчанию пусто
iorapd.binder.fake ложный ответ на событие, вероятно, просто для проверки канала По умолчанию — ложь
iorap.inode2имя_файла.out_of_process Когда процесс компилятора выполняет inode2filename, разрешено ли inode2filename быть ipc, значение true равно ipc По умолчанию верно
iorap.inode2имя_файла.log.verbose Печатать ли подробный журнал уровня в inode2filename По умолчанию — ложь
3 Использование кода
frameworks/base/startop/
system/iorap/
frameworks/base/services/java/com/android/server/SystemServer.java
|
|