Demon ochrony pamięci procesu

Android 17 i nowsze wersje obsługują demona PMGD (process memory guardian daemon), który chroni kondycję systemu i komfort użytkownika, proaktywnie zarządzając wykorzystaniem pamięci w poszczególnych procesach. Demon zwiększa ogólną stabilność urządzenia, łagodnie egzekwując limity pamięci w przypadku określonych procesów docelowych i sprawdzając, czy izolowane wycieki pamięci lub skoki nie powodują pogorszenia wydajności całego systemu.

Tradycyjne globalne narzędzia do zwalczania problemów z małą ilością pamięci działają tylko wtedy, gdy cały system jest pod presją, natomiast PMGD stosuje bardziej szczegółowe podejście. Demon osiąga to monitorując wartości pamięci grupy kontrolnej v2 dla procesów docelowych. Gdy proces docelowy przekroczy skonfigurowane limity pamięci, pmgd obsługuje naruszenia limitów, rejestrując atomy pamięci Statsd przed zakończeniem procesu.

Jak to działa

Demon używa inotify do nasłuchiwania zdarzeń związanych z presją pamięci (w szczególności aktywności związanej z dużą ilością pamięci przy użyciu memory.events). Gdy monitorowany proces wywoła zdarzenie związane z pamięcią, pmgd wykona te działania:

  1. Sprawdzenie pamięci anonimowej: ocenia anonimową pamięć procesu. Jeśli przekroczy ona skonfigurowany limit anon_limit_in_mb, pmgd natychmiast zakończy proces.
  2. Okres oczekiwania na odzyskanie: jeśli anonimowa pamięć jest poniżej określonego limitu anonimowej pamięci, pmgd czeka na okres karencji odzyskiwania systemu (reclaim_wait_time_secs).
  3. Ocena pamięci po odzyskaniu: jeśli po okresie karencji wartość memory.current procesu docelowego pozostanie większa lub równa memory.high albo anonimowa pamięć przekroczy anon_limit_in_mb, pmgd natychmiast zakończy proces.

Dzieje się tak, dopóki proces nie zostanie zakończony lub odzyskanie w procesie nie spowoduje zmniejszenia wykorzystania pamięci poniżej określonych limitów pamięci.

Funkcje związane ze zdrowiem systemu

  • Ograniczanie liczby ponownych uruchomień: aby zapobiec pętlom rozruchowym lub trwałym awariom, pmgd śledzi zakończenia procesów w pliku /data/misc/pmgd/history.json. Demon ogranicza procesy do jednego zakończenia zainicjowanego przez pmgd na ponowne uruchomienie urządzenia.

Konfiguracja SELinux

Możliwość monitorowania procesów przez PMGD jest ograniczona przez zasady SELinux. Jeśli skonfigurujesz PMGD do monitorowania procesu, którego domena nie jest dozwolona przez zasady, np. procesu systemowego specyficznego dla dostawcy, PMGD nie będzie mógł go monitorować i w logcat mogą pojawić się odmowy SELinux.

Aby umożliwić PMGD monitorowanie procesów w dodatkowych domenach, musisz rozszerzyć uprawnienia PMGD, aktualizując zasady SELinux specyficzne dla urządzenia.

Poniżej znajdziesz przykład pliku device/<vendor>/<device>/sepolicy/pmgd.te który dodaje dostęp do nowej domeny:

# Allow pmgd to access vendor_system_apps
r_dir_file(pmgd, vendor_system_apps)

Więcej informacji o pisaniu zasad specyficznych dla urządzenia znajdziesz w artykule Implementowanie SELinux.

Konfiguracja zdefiniowana przez dostawcę

Konfiguracja PMGD jest sterowana przez dostawcę i konfigurowana za pomocą wymaganego pliku JSON /vendor/etc/pmgd/config.json. Zawiera on listę procesów do śledzenia, skonfigurowany profil limitu pamięci (przy użyciu profili zadań cgroup), oraz limit anonimowej pamięci w megabajtach.

Pola konfiguracji dostawcy

Podana konfiguracja JSON to lista procesów i ich limitów zdefiniowanych przez te pola:

Pole Typ Wymagane Opis Domyślny
target_cmd Ciąg znaków Tak Nazwa polecenia procesu docelowego do monitorowania, np. system_server. Nie dotyczy
uid Liczba całkowita Nie Identyfikator użytkownika (UID) procesu. Jeśli to pole zostanie pominięte, pmgd zastosuje regułę globalnie do każdego procesu pasującego do target_cmd. Nie dotyczy
reclaim_wait_time_secs Liczba całkowita Nie Okres karencji w sekundach, w którym system czeka na odzyskanie pamięci przed ponowną oceną limitu pamięci. 5
mem_limit_profile Ciąg znaków Tak Nazwa profilu zadania cgroup który ustawia `memory.high`. Służy do ustawiania limitu pamięci procesu. Nie dotyczy
anon_limit_in_mb Liczba całkowita Tak Ostateczny limit anonimowej pamięci w megabajtach. Jeśli wykorzystanie anonimowej pamięci przekroczy tę wartość, pmgd natychmiast zakończy proces. Nie dotyczy
additional_task_profiles Lista ciągów znaków Nie Lista dodatkowych profili zadań, które pmgd stosuje do procesu po rozpoczęciu monitorowania. Pusta lista

Poniżej znajdziesz przykład konfiguracji profilu zadania cgroup w pliku vendor/etc/task_profiles.json:

{
  "Attributes": [
    ...
    {
      "Name": "MemHigh",
      "Controller": "memory",
      "File": "memory.high"
    }
  ],
  "Profiles": [
    {
      "Name": "SystemServerMemoryHighLimit",
      "Actions": [
        {
          "Name": "SetAttribute",
          "Params":
          {
            "Name": "MemHigh",
            "Value": "1080M"
          }
        }
      ]
    }
  ]
}

Poniżej znajdziesz przykład konfiguracji PMGD w pliku 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
    }
  ]
}