| traced_perf
Отслеживает показатели производительности для системных вызовов и сигналов Тип файла: служба Комментарии
https://blog.csdn.net/feelabclihu/article/details/128744823
Traced_perf из набора инструментов Perfetto
ОБЗОР ИНСТРУМЕНТА PERF
Linux содержит множество инструментов анализа производительности. Инструмент perf (в частности, linux-tools perf) — это инструмент, представленный в ядре Linux 2.6.31 в 2009 году.
Его основная функция — отслеживание аппаратного счетчика производительности (PMU), точек трассировки, счетчика производительности программного обеспечения (hrtimer), динамических зондов и другой информации.
Ядро Linux инкапсулирует эту информацию и предоставляет ее в форме системного вызова (perf_event_open и т.д.), абстрагируя ее в концепцию событий, которые могут использоваться процессами пользовательского пространства.
Как инструмент командной строки в Linux, perf может считывать эти события и в сочетании со сценариями анализа производительности предоставляет дополнительные команды, такие как статистика, топ, запись, отчет и т.д., для адаптации к потребностям более детального анализа.
В Android обычно используется не старый инструмент perf linux-tools, а инструмент perf, настроенный для Android для поддержки некоторых функций, расширенных в Android.
simpleperf:
Впервые Android был представлен в версии Android 6.0 (2015 г.), и его история насчитывает уже 7 лет (2022 г.). Его основная функция — реализация основных функций инструмента perf в Linux.
traced_perf:
Perfetto был разработан, чтобы иметь возможность:
1) Использовать платформу perfetto для обеспечения профилирования, очистки, пользовательского интерфейса и других возможностей.
2) Из-за все более строгого контроля разрешений Android и требований MAC первоначальный способ выполнения всех функций независимого домена Selinux Simpleperf больше не может соответствовать потребностям песочницы, и требуется строгая изоляция домена.
СТРУКТУРА TRACED_PERF
1. Структура кода
Код traced_perf находится в каталоге external/perfetto/src/profiling/perf/ AOSP и
на самом деле является подкаталогом проекта perfetto.
Код в этом каталоге следующий:
[img perf1.pgg]
Код разделен на три категории:
Связанный со сценарием компиляции: BUILD.gn
Связанный с модульным тестом: X_unittest.cc
Логика основного кода
В дополнение к указанному выше каталогу кода в главном каталоге perfetto также есть файл:
external/perfetto/traced_perf.rc. Этот файл является сценарием запуска исполняемого файла трассировки_perf.
2. Структура времени выполнения
Судя по сценарию компиляции external/perfetto/Android.bp, видно, что traced_perf в конечном итоге будет скомпилирована в исполняемый файл и установлена в /system/bin/traced_perf.
Этот исполняемый файл существует в форме демона, а его запуск и завершение контролируются соответствующим сценарием запуска rc.
Его жизненный цикл во время выполнения можно проанализировать с помощью файла trased_perf.rc:
Конфигурация разрешений для traced_perf
Пользователь traced_perf установлен на nobody, что может гарантировать, что разрешения не повлияют на других пользователей и избежать злонамеренного взлома для получения привилегий.
В группу "traced_perf" входят "nobody", "readproc" и "readtracefs".
"Readproc" дает ему разрешение на чтение каталога /proc/PID, а "readtracefs" дает ему разрешение на чтение каталога, в котором установлен "tracefs". Эти два разрешения необходимы для правильной работы traced_perf.
traced_perf предоставляет соответствующие возможности:
KILL — разрешить Traced_perf отправлять сигналы другим процессам.
DAC_READ_SEARCH позволяет ему, по крайней мере, получать разрешения для некоторых файлов, даже не имея возможности обнаружить существование некоторых файлов. Оба разрешения необходимы для правильной работы трассировки_perf.
task_profiles — установить для traced_perf тип cgroup с высокой емкостью (размоткой), чтобы планировщик мог дать ей более разумное распределение ресурсов.
traced_perf применяется к unix_socket с именем "traced_perf".
Этот unix_socket является каналом связи между "traced_perf" и профилируемым процессом
Управление жизненным циклом Traced_perf осуществляется с помощью триггера свойства.
Если для persist.traced_perf.enable установлено значение true, трассировка_perf будет запускаться автоматически. В то же время им также будут управлять sys.init.perf_lsm_hooks и trased.lazy.traced_perf.
АРХИТЕКТУРА TRACED_PERF
Traced_perf является неотъемлемой частью набора инструментов perfetto и соответствует модели обслуживания perfetto.
Как производитель службы трассировки,trased_perf взаимодействует со службой трассировки через два канала, а именно канал IPC и разделяемую_память. Канал IPC представляет собой unix-сокет.
«shared_memory» относится к каналу общей памяти, установленному службой трассировки.
Этот канал общей памяти имеет две функции:
1. Осуществление эффективной передачи данных между процессами. Здесь передаются в основном структурированные данные точек отбора проб.
2. Изолировать его от потока управления, чтобы избежать рисков безопасности и конфиденциальности, вызванных злонамеренным взломом.
Trased_perf сам по себе, как сторона производителя, предоставляет источник данных, и каждый производитель может предоставить несколько источников данных.
Источник данных, предоставляемый самим Traced_perf, включает в себя linux.perf и источник данных метаданных.
Служба отслеживания, являющаяся основной службой perfetto на мобильном телефоне, берет на себя роль основного средства контроля. Служба в основном представлена как отслеживаемый процесс на мобильном телефоне. С одной стороны, она получает управление файлом конфигурации потребителя, а с другой стороны, преобразует файл конфигурации в управление Производителя; она также выполняет функцию мост между производителем и потребителем. Канал данных между производителем и потребителем использует память буфера трассировки. Эта часть памяти не используется совместно между процессами, поэтому можно поддерживать изоляцию данных.
Потребитель
Под потребительской стороной понимаются потребительские данные трассировки perfetto, такие как perfetto ui, команда оболочки, трассировщик и т.д. Потребительскую сторону также можно настроить и добавить настраиваемого потребителя в Android для настройки источника данных.
Канал IPC между стороной потребителя и службой отслеживания в основном подключается через сокет unix.
Для Traced_perf создание канала IPC состоит из следующих процессов:
Создать экземпляр Task_runner и AndroidRemoteDescriptorGetter.
Task_runner — это экземпляр класса инструмента Looper, используемого в трассировке_perf.AndroidRemoteDescriptorGetter — это класс, созданный трассировкой_perf для получения частных данных процесса приложения, которое необходимо отслеживать.
Установить соединение со службой отслеживания.
Запустите цикл сообщений
СТРУКТУРА КАНАЛА IPC
TaskRunner представляет собой интерфейс Looper. Экземпляр, используемый PerfProducer, представляет собой экземпляр TaskRunner, созданный на основе сокета домена unix.
Этот Task_runner_ передается между различными структурами и отвечает за отправку и обработку различных сообщений.
ProducerEndPoint: класс интерфейса стороны производителя службы трассировки, экземпляр которого создается с помощью ProducerIPCClientImpl.
Чтобы зарегистрировать класс PerfProducer в качестве производителя службы трассировки, необходимо выполнить операции, среди которых ProducerIPCClient::Connect — статический метод, который создает экземпляр ProducerIPCClientImpl и возвращает его в форме unique_ptr.
После завершения описанного выше процесса фактически устанавливается процесс обработки событий PerfProducer.
Вторым параметром в ProducerIPCClient::Connect является указательConnectService.
Фактически указатель объекта PerfProducer передается объекту ProducerEndpoint.
Он передается через третьего производителя параметра в конструкторе ProducerIPCClientImpl.
Потребительская сторона должна указать, из какого «источника данных» собирать данные, а производитель может предоставить источник данных. Определение источника данных в perfetto указывается в форме proto.
В PerfProducer он абстрагирует определение источника данных и описывает его через DataSourceState.
Структура данных, соответствующая DataSource — это структура DataSourceState в Traced_perf.
DataSourceState поддерживает указатель TraceWriter, который предоставляет связанные методы для записи данных Trace.
Трассировщик
Класс TraceWriter предназначен для того, чтобы пользователи могли записывать данные Trace в форме нулевой копии в общей памяти perfetto, что упрощает пользователям эффективную запись данных Trace.
Объект ProducerEndPoint будет взаимодействовать с PerfProducer через service_sock_name, предоставленный объектом PerfProducer. Когда соединение будет установлено, будет введен процесс IPC.
Сервер отправит соответствующие инструкции в соответствии с форматом протокола, определенным perfetto.
Приведенное выше сообщение будет проанализировано ProducerEndPoint и в конечном итоге преобразовано в вызов виртуальной функции класса интерфейса Producer .
|
|