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:
- Sprawdzenie pamięci anonimowej: ocenia anonimową pamięć procesu. Jeśli przekroczy ona skonfigurowany limit
anon_limit_in_mb,pmgdnatychmiast zakończy proces. - Okres oczekiwania na odzyskanie: jeśli anonimowa pamięć jest poniżej określonego limitu anonimowej pamięci,
pmgdczeka na okres karencji odzyskiwania systemu (reclaim_wait_time_secs). - Ocena pamięci po odzyskaniu: jeśli po okresie karencji wartość
memory.currentprocesu docelowego pozostanie większa lub równamemory.highalbo anonimowa pamięć przekroczyanon_limit_in_mb,pmgdnatychmiast 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 przezpmgdna 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
}
]
}