демон-хранитель памяти процесса

Android 17 и более поздние версии поддерживают демон защиты памяти процессов (PMGD), который защищает работоспособность системы и удобство использования памяти для каждого процесса в отдельности. Демон повышает общую стабильность устройства, корректно устанавливая ограничения на использование памяти для конкретных целевых процессов и проверяя, что изолированные утечки или скачки памяти не приводят к снижению производительности всей системы.

В то время как традиционные глобальные средства завершения процессов при нехватке памяти срабатывают только тогда, когда вся система находится под давлением, PMGD использует гранулярный подход. Демон достигает этого, отслеживая значения памяти Control Group v2 для целевых процессов. Когда целевой процесс превышает заданные пределы памяти, pmgd обрабатывает нарушения лимитов, регистрируя атомы памяти Statsd перед завершением процесса.

Как это работает

Демон использует inotify для отслеживания событий, связанных с нехваткой памяти (в частности, высокой активностью в памяти, определяемой с помощью memory.events ). Когда отслеживаемый процесс инициирует событие, связанное с памятью, pmgd выполняет следующие действия:

  1. Проверка анонимной памяти: оценивает объем анонимной памяти процесса. Если он превышает заданный предел anon_limit_in_mb , pmgd немедленно завершает процесс.
  2. Период ожидания освобождения памяти: Если объем анонимной памяти не превышает указанный лимит, pmgd ожидает истечения системного льготного периода освобождения памяти ( reclaim_wait_time_secs ).
  3. Оценка памяти после освобождения: если 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
    }
  ]
}