Pamięć jest monitorowana przez demon lmkd
, który ogranicza ilość pamięci na Androidzie.
stanu działającego systemu Android i reaguje na wysokie wykorzystanie pamięci, eliminując
najmniej istotne procesy zapewniające jego akceptowalną wydajność
poziomów.
Informacje o wykorzystaniu pamięci
System Android uruchomiony równolegle wiele procesów może napotkać gdy pamięć systemu się wyczerpuje i procesy wymagające więcej zauważamy opóźnienia w pamięci. Wyczerpanie pamięci, czyli stan, w którym system ma za mało pamięci; wymaga zwolnienia pamięci przez Androida (aby zmniejszyć obciążenie) przez ograniczanie lub zabijanie nieistotnych procesów, w celu zwolnienia niekrytycznych zasobów w pamięci podręcznej itd.
Dawniej Android monitorował wykorzystanie pamięci systemowej za pomocą systemu w jądrze.
sterownika Low Memory Killer (LMK), czyli sztywnego mechanizmu, który opiera się na zakodowaniu na stałe
. Od jądra 4.12 sterownik LMK jest usuwany ze strumienia nadrzędnego.
jądro, a przestrzeń użytkownika lmkd
monitoruje pamięć i zabija procesy
zadania.
Informacje o budynku ciśnieniowym
Android 10 i nowsze wersje obsługują nowy tryb lmkd
, który
korzysta z monitorów ciśnienia jądra (PSI) do monitorowania poziomu wykorzystania pamięci
wykrywaniem zagrożeń. Poprawka PSI w jądrze nadrzędnym (przywrócona do wersji 4.9 i 4.14)
jądra) mierzy czas opóźnienia zadań w wyniku
niedobory pamięci. Opóźnienia te bezpośrednio wpływają na wygodę użytkowników,
to wygodny wskaźnik do określania poziomu wykorzystania pamięci.
jądro robocze zawiera także monitory PSI, które umożliwiają korzystanie z przestrzeni użytkownika z podwyższonymi uprawnieniami
procesów (takich jak lmkd
) w celu określenia progów takich opóźnień oraz
subskrybuj zdarzenia z jądra po przekroczeniu progu.
Monitory PSI a sygnały maszyn wirtualnych
Ponieważ sygnały vmpressure
(wygenerowane przez jądro na potrzeby pamięci
wykrywania ciśnienia i stosowanych przez lmkd
) często zawierają wiele wyników fałszywie pozytywnych,
lmkd
musi przeprowadzić filtrowanie, aby określić, czy pamięć znajduje się pod rzeczywistym prądem.
Powoduje to niepotrzebne wybudzenia urządzenia lmkd
i korzystanie z dodatkowych
w zasobach obliczeniowych. Użycie monitorów PSI zwiększa dokładność pamięci.
wykrywanie ciśnienia i minimalizuje obciążenie związane z filtrowaniem.
Użyj monitorów PSI
Aby używać monitorów PSI zamiast zdarzeń vmpressure
, skonfiguruj
ro.lmk.use_psi
. Wartość domyślna to true
, co oznacza, że PSI monitoruje
domyślny mechanizm wykrywania wykorzystania pamięci na potrzeby środowiska lmkd
. Ponieważ monitory PSI
wymaga obsługi jądra systemu operacyjnego, musi zawierać poprawki backendu PSI i być
skompilowane z włączoną obsługą PSI (CONFIG_PSI=y
).
Wady sterownika LMK umieszczonego w jądrze
Android wycofuje sterownik LMK z powodu szeregu problemów, takich jak:
- Trzeba było intensywnie dostroić urządzenia z małą ilością pamięci RAM, nie działa zbyt dobrze w zbiorach zadań z aktywną pamięcią podręczną stron opartą na plikach. słaba skuteczność zakończyła się ciosami bez zabójstw.
- Sterownik jądra LMK opierał się na limitach wolnej pamięci, bez skalowania na wykorzystanie pamięci.
- Ze względu na sztywność konstrukcji partnerzy często dostosowywali przetwornik aby działała na ich urządzeniach.
- Sterownik LMK został podłączony do interfejsu API Shrinker, co nie było
przeznaczone do ciężkich operacji, takich jak poszukiwanie celów i zabijanie
co spowolniło proces
vmscan
.
LMKD przestrzeni użytkownika
Przestrzeń użytkownika lmkd
ma te same funkcje co sterownik jądra.
ale wykorzystuje istniejące
mechanizmy jądra do wykrywania i szacowania wykorzystania pamięci. Taka
między innymi z użyciem zdarzeń vmpressure
wygenerowanych przez jądra lub przerw w działaniu ciśnienia
monitory informacji (PSI), aby otrzymywać powiadomienia o poziomach wykorzystania pamięci,
i używanie funkcji grupowania pamięci w celu ograniczenia zasobów pamięci przydzielonych poszczególnym
w zależności od ważności procesu.
Korzystanie z LDMKD w przestrzeni użytkownika w Androidzie 10
Na Androidzie 9 i nowszych przestrzeń użytkownika lmkd
jest aktywowana, jeśli
nie wykryto sterownika LMK znajdującego się w jądrze. Ponieważ przestrzeń użytkownika lmkd
wymaga obsługi cgroups pamięci przez jądra systemu, jądro musi być skompilowane za pomocą
następujące ustawienia konfiguracji:
CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y
Strategie zabijania
Przestrzeń użytkownika lmkd
obsługuje strategie zakończenia na podstawie zdarzeń typu vmpressure
lub PSI
monitorowanych, ich wagi i innych wskazówek, takich jak wykorzystanie zamiany. Zabij
strategie różnią się w zależności od urządzenia z małą ilością pamięci i urządzeniami o dużej wydajności:
- W przypadku urządzeń z małą ilością pamięci system powinien tolerować wyższe wykorzystanie pamięci w normalnym trybie.
- W przypadku urządzeń o wysokiej wydajności wykorzystanie pamięci powinno być postrzegane jako nieprawidłowe. i rozwiązać ten problem, zanim wpłynie to na ogólną skuteczność.
Strategię zabijania możesz skonfigurować za pomocą właściwości ro.config.low_ram
. Dla:
szczegółowe informacje: Niski poziom pamięci RAM
Przestrzeń użytkownika lmkd
obsługuje również starszy tryb, w którym podejmuje decyzje o usunięciu treści
wykorzystując te same strategie co znajdujący w jądrze sterownik LMK (czyli bezpłatny
progi pamięci i pamięci podręcznej plików). Aby włączyć starszy tryb, ustaw wartość
ro.lmk.use_minfree_levels
do usługi true
.
Skonfiguruj LDAP
Skonfiguruj usługę lmkd
na konkretnym urządzeniu, korzystając z podanych niżej właściwości.
Właściwość | Użyj | Domyślny |
---|---|---|
ro.config.low_ram
|
Określ, czy urządzenie ma mało pamięci RAM czy dużą wydajność. | false
|
ro.lmk.use_psi |
Używaj monitorów PSI (zamiast zdarzeń vmpressure ). |
true |
ro.lmk.use_minfree_levels
|
Używaj progów wolnej pamięci i pamięci podręcznej plików w celu zakończenia procesu decyzji (czyli dopasować do funkcji w jądrze, sterownika LMK). | false
|
ro.lmk.low
|
Minimalny wynik oom_adj procesów kwalifikujących się do zastosowania
zabitych na niskim poziomie vmpressure .
|
1001 (wyłączony) |
ro.lmk.medium
|
Minimalny wynik oom_adj procesów kwalifikujących się do zastosowania
zabitych na średnim poziomie vmpressure .
|
800 (usługi w pamięci podręcznej lub usługi niepotrzebne) |
ro.lmk.critical
|
Minimalny wynik oom_adj procesów kwalifikujących się do zastosowania
zabitych na krytycznym poziomie: vmpressure .
|
0 (dowolny proces) |
ro.lmk.critical_upgrade
|
Włącz uaktualnienie do poziomu krytycznego. | false
|
ro.lmk.upgrade_pressure
|
Maksymalna wartość mem_pressure , o jakiej przechodzi na wyższy poziom.
ponieważ system zbyt często się zmienia.
|
100 (wyłączony) |
ro.lmk.downgrade_pressure
|
Minimalna wartość mem_pressure , w której vmpressure
jest ignorowane, ponieważ wciąż jest dostępna wystarczająca ilość wolnej pamięci.
|
100 (wyłączony) |
ro.lmk.kill_heaviest_task
|
Zakończ wykonanie najbardziej odpowiedniego kwalifikującego się zadania (najlepsza decyzja) w porównaniu z innym kwalifikującym się zadaniem (szybka decyzja). | true
|
ro.lmk.kill_timeout_ms
|
Czas (w milisekundach) po zabiciu, po którym nie następuje żadne dodatkowe zabicie gotowe. | 0 (wyłączony) |
ro.lmk.debug
|
Włącz dzienniki debugowania lmkd .
|
false
|
Przykładowa konfiguracja urządzenia:
PRODUCT_PROPERTY_OVERRIDES += \
ro.lmk.low=1001 \
ro.lmk.medium=800 \
ro.lmk.critical=0 \
ro.lmk.critical_upgrade=false \
ro.lmk.upgrade_pressure=100 \
ro.lmk.downgrade_pressure=100 \
ro.lmk.kill_heaviest_task=true
Obszar użytkownika w Androidzie 11
Android 11 to jeszcze lepsze lmkd
, wprowadzając
strategii zabijania. Strategia zabijania wykorzystuje mechanizm PSI do kontrolowania presji pamięci
Wykrywanie wprowadzone w Androidzie 10. lmkd
in
Konta Androida 11 dotyczące poziomów wykorzystania zasobów pamięci
i szumianie, aby zapobiec wyczerpaniu pamięci i pogorszeniu wydajności.
Ta likwidacja strategii zastępuje poprzednie strategie i może być stosowana
urządzeniami z Androidem Go o dużej wydajności lub małej ilości pamięci RAM.
Wymagania jądra systemu
W przypadku urządzeń z Androidem 11 system lmkd
wymaga tych funkcji jądra:
- Dołącz poprawki PSI i włącz PSI (backporty dostępne popularne jądra Androida w wersjach 4.9, 4.14 i 4.19).
- Uwzględnij poprawki obsługujące PIDFD (backporty dostępne w typowych obszarach Androida jądro w wersjach 4.9, 4.14 i 4.19).
- W przypadku urządzeń z małą ilością pamięci RAM dołącz grupy grup pamięci.
Jądro musi być skompilowane z następującymi ustawieniami konfiguracji:
CONFIG_PSI=y
Konfigurowanie LDAP w Androidzie 11
Strategia zabijania pamięci w Androidzie 11 obsługuje pokrętła i ustawienia domyślne wymienione poniżej. Funkcje te działają na wysokiej wydajności i małą ilość pamięci RAM.
Właściwość | Użyj | Domyślny | |
---|---|---|---|
Wysoka wydajność | Mało pamięci RAM | ||
ro.lmk.psi_partial_stall_ms |
Częściowy próg przestoju PSI (w milisekundach) do aktywowania niskiej wartości powiadomienia dotyczące pamięci. Jeśli urządzenie otrzymuje powiadomienia o wykorzystaniu pamięci za późno, zmniejsz tę wartość, aby otrzymywać wcześniejsze powiadomienia. Jeśli pamięć gdy powiadomienia o ciśnieniu są niepotrzebnie wyzwalane, zwiększ tę wartość, urządzenie jest mniej wrażliwe na szumy. | 70 |
200 |
ro.lmk.psi_complete_stall_ms |
Pełny próg przestoju PSI (w milisekundach) potrzebny do aktywowania ważne powiadomienia dotyczące pamięci. Jeśli urządzenie otrzymuje krytyczną pamięć zbyt późne powiadomienia o ciśnieniu. Zmniejsz tę wartość, aby otrzymywać ją wcześniej powiadomienia. Jeśli zostaną uruchomione powiadomienia o krytycznym wykorzystaniu pamięci niepotrzebnie zwiększyć tę wartość, aby urządzenie było mniej wrażliwe hałas. | 700 |
|
ro.lmk.thrashing_limit |
Maksymalna ilość zawężonych zestawów roboczych jako procent całości rozmiar pamięci podręcznej strony opartej na pliku. Przekształcenia zakresu roboczego powyżej tej wartości średniej że system jest uważany za niszczący pamięć podręczną stron. Jeśli wydajność pamięci masowej wpływa na wydajność urządzenia, wartość ograniczenia thrashingu. Jeśli wydajność urządzenia spada niepotrzebnie i niepotrzebnie wiernie wstręt, zwiększ wartość, aby umożliwić szamotanie. | 100 |
30 |
ro.lmk.thrashing_limit_decay |
Spadek progu drgań wyrażony jako procent pierwotny próg użyty do jego obniżenia, gdy system nie dochodzi do siebie nawet po śmierci. Jeśli ciągłe tragedie skutkuje niepotrzebnymi zabójstwa, zmniejsz wartość. Jeśli reakcja na ciągłe szarpanie po zabójstwo jest zbyt wolne, zwiększ wartość. | 10 |
50 |
ro.lmk.swap_util_max |
Maksymalna ilość wymienianej pamięci jako procent łącznej liczby elementów wymiennych
pamięci. Gdy wymieniona pamięć przekroczy ten limit, oznacza to, że
system wymienił większość pamięci wymiennej i nadal nie ustaje pod presją.
Może się tak zdarzyć, gdy alokacje niewymienne generują pamięć
której nie można ograniczyć, wymieniając je, ponieważ większość wymiennych
pamięć jest już wymieniona. Wartością domyślną jest 100, co
wyłącza tę kontrolę. Jeśli wydajność urządzenia wpływa w okresie
wykorzystanie pamięci przy wysokim wykorzystaniu zamiany i poziomie swobodnej zamiany
nie spada do ro.lmk.swap_free_low_percentage , zmniejsz
wartość do ograniczenia wykorzystania zamiany. |
100 |
100 |
Nowe pokrętła dostrajania też obsługują nową strategię zabijania.
Właściwość | Użyj | Domyślny | |
---|---|---|---|
Wysoka wydajność | Mało pamięci RAM | ||
ro.lmk.swap_free_low_percentage |
Poziom swobodnej zamiany jako procent całkowitej przestrzeni wymiany. „lmkd” używa tej wartości jako wartości progowej, kiedy należy uznać system za zamiennik głodny w kosmosie. Jeśli „lmkd” nie działa przy zbyt dużej ilości miejsca do zmiany, zmniejszyć tę wartość procentową. Jeśli zabójstwa z użyciem „lmkd” następują zbyt późno, co powoduje brak pamięci zabójstwa, zwiększ odsetek. | 20 |
10 |
ro.lmk.debug |
Spowoduje to włączenie logów debugowania „lmkd”. Włącz debugowanie podczas dostrajania. | false |