Demon zabijający mało pamięci

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