В Android 17 и более поздних версиях поддерживается демон PMGD (process memory guardian daemon), который защищает систему и обеспечивает удобство использования, активно управляя использованием памяти на уровне процессов. Демон повышает стабильность работы устройства, корректно ограничивая объем памяти для определенных целевых процессов и проверяя, чтобы изолированные утечки памяти или скачки не приводили к снижению производительности системы.
В отличие от обычных глобальных демонов, которые срабатывают, только когда вся система перегружена, PMGD использует детализированный подход. Демон отслеживает значения памяти группы управления версией 2 для целевых процессов.
Если целевой процесс превышает заданные ограничения памяти, pmgdобрабатывает нарушения, регистрируя атомы памяти Statsd, прежде чем завершить процесс.
Принцип работы
Демон использует inotify для отслеживания событий нехватки памяти (в частности, высокой активности памяти с помощью memory.events). Когда отслеживаемый процесс вызывает событие памяти, pmgd выполняет следующие действия:
- Анонимная проверка памяти. Оценивает анонимную память процесса. Если оно превышает заданное значение
anon_limit_in_mb,pmgdнемедленно завершает процесс. - Период ожидания возврата. Если анонимная память не превышает заданный лимит,
pmgdждет, пока не истечет период отсрочки возврата системы (reclaim_wait_time_secs). - Оценка памяти после освобождения. Если после льготного периода значение
memory.currentцелевого процесса по-прежнему больше или равноmemory.highили анонимная память превышаетanon_limit_in_mb,pmgdнемедленно завершает процесс.
Это происходит непрерывно, пока процесс не будет завершен или пока его использование памяти не снизится до указанных пределов.
Функции для отслеживания состояния системы
- Ограничение частоты перезагрузок. Чтобы предотвратить циклы перезагрузки или постоянные сбои,
pmgdотслеживает завершение процессов в/data/misc/pmgd/history.json. Демон ограничивает процессы до одного завершения, инициированногоpmgd, на каждую перезагрузку устройства.
Конфигурация SELinux
Возможность PMGD отслеживать процессы ограничена политикой SELinux. Если вы настроите PMGD на мониторинг процесса, домен которого не разрешен правилами, например системного процесса поставщика, PMGD не сможет его отслеживать, и в logcat могут появиться сообщения об отказе SELinux.
Чтобы разрешить PMGD отслеживать процессы в дополнительных доменах, необходимо расширить разрешения PMGD, обновив политику SELinux для PMGD на устройстве.
Ниже приведен пример файла device/<vendor>/<device>/sepolicy/pmgd.te, в котором добавляется доступ к новому домену:
# Allow pmgd to access vendor_system_apps
r_dir_file(pmgd, vendor_system_apps)
Подробнее о том, как создавать правила для конкретных устройств…
Конфигурация, заданная поставщиком
Конфигурация PMGD определяется поставщиком и задается в обязательном файле JSON.
/vendor/etc/pmgd/config.json В нем перечислены процессы, которые нужно отслеживать, их настроенный профиль ограничения памяти (с использованием профилей задач cgroup) и жесткое ограничение анонимной памяти в мегабайтах.
Поля конфигурации поставщика
Предоставленная конфигурация JSON – это список процессов и их ограничений, определенных следующими полями:
| Поле | Тип | Обязательное поле | Описание | По умолчанию |
|---|---|---|---|---|
target_cmd |
Строка | Да | Название команды целевого процесса, который нужно отслеживать, например system_server. |
Н/Д |
uid |
Целое число | Нет | Идентификатор пользователя (UID) процесса. Если этот параметр не указан, pmgd применяет правило ко всем процессам, соответствующим target_cmd. |
Н/Д |
reclaim_wait_time_secs |
Целое число | Нет | Льготный период в секундах, в течение которого система должна освободить память, прежде чем снова будет проверен лимит памяти. | 5 |
mem_limit_profile |
Строка | Да | Название профиля задачи cgroup, в котором задано значение `memory.high`. Используется для установки лимита памяти процесса. | Н/Д |
anon_limit_in_mb |
Целое число | Да | Максимальный анонимный лимит памяти в мегабайтах. Если использование анонимной памяти превышает это значение, pmgd немедленно завершает процесс. |
Н/Д |
additional_task_profiles |
Список строк | Нет | Список дополнительных профилей задач, к которым pmgd применяется в процессе мониторинга. |
Список пуст |
Ниже приведен пример конфигурации профиля задач cgroup в файле vendor/etc/task_profiles.json:
{
"Attributes": [
...
{
"Name": "MemHigh",
"Controller": "memory",
"File": "memory.high"
}
],
"Profiles": [
{
"Name": "SystemServerMemoryHighLimit",
"Actions": [
{
"Name": "SetAttribute",
"Params":
{
"Name": "MemHigh",
"Value": "1080M"
}
}
]
}
]
}
Ниже приведен пример конфигурации PMGD в файле
vendor/etc/pmgd/config.json:
{
"targets": [
{
"target_cmd": "system_server",
"uid": 1000,
"reclaim_wait_time_secs": 5,
"mem_limit_profile": "SystemServerMemoryHighLimit",
"anon_limit_in_mb": 300
}
]
}