Android 17 и более поздние версии поддерживают демон защиты памяти процессов (PMGD), который защищает работоспособность системы и удобство использования памяти для каждого процесса в отдельности. Демон повышает общую стабильность устройства, корректно устанавливая ограничения на использование памяти для конкретных целевых процессов и проверяя, что изолированные утечки или скачки памяти не приводят к снижению производительности всей системы.
В то время как традиционные глобальные средства завершения процессов при нехватке памяти срабатывают только тогда, когда вся система находится под давлением, PMGD использует гранулярный подход. Демон достигает этого, отслеживая значения памяти Control Group v2 для целевых процессов. Когда целевой процесс превышает заданные пределы памяти, 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 не сможет его отслеживать, и вы можете увидеть отказы SELinux в logcat.
Чтобы разрешить PMGD отслеживать процессы в дополнительных доменах, необходимо расширить права доступа PMGD, обновив политику SELinux для PMGD, специфичную для вашего устройства.
Ниже приведён пример файла device/<vendor>/<device>/sepolicy/pmgd.te , который добавляет доступ к новому домену:
# Allow pmgd to access vendor_system_apps
r_dir_file(pmgd, vendor_system_apps)
Для получения дополнительной информации о написании политик для конкретных устройств см. раздел «Реализация SELinux» .
Конфигурация, определяемая поставщиком
Конфигурация 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
}
]
}