Démon tueur à faible mémoire

Le démon tueur de mémoire basse applications ( lmkd process) surveille l'état de mémoire d'un système en cours d' exécution et les applications réagit à une pression élevée de la mémoire en tuant les moins des processus essentiels pour maintenir le système à effectuer des niveaux acceptables.

À propos de la pression de la mémoire

Un système Android exécutant plusieurs processus en parallèle peut rencontrer des situations où la mémoire système est épuisée et les processus qui nécessitent plus de mémoire subissent des retards notables. La pression de la mémoire, un état dans lequel le système est en cours d' exécution court sur la mémoire, nécessite Android à la mémoire libre (pour soulager la pression) par étranglement ou tuer des processus sans importance, en demandant des processus aux ressources mises en cache non critiques libres, et ainsi de suite.

Historiquement, Android surveillait la pression de la mémoire système à l'aide d'un pilote LMK (low memory killer) intégré au noyau, un mécanisme rigide qui dépend de valeurs codées en dur. A partir de 4,12 noyau, le pilote de LMK est retiré du noyau en amont et l'espace utilisateur lmkd effectue la surveillance de la mémoire et des tâches de traitement tuer.

Informations sur le décrochage

Android 10 et plus tard soutenir un nouveau lmkd mode qui utilise les informations de décrochage de pression de moniteurs (PSI) pour la détection de la pression de la mémoire. L'ensemble de correctifs PSI dans le noyau en amont (rétroporté vers les noyaux 4.9 et 4.14) mesure le temps pendant lequel les tâches sont retardées en raison de pénuries de mémoire. Comme ces retards affectent directement l'expérience utilisateur, ils représentent une mesure pratique pour déterminer la gravité de la pression de la mémoire. Le noyau en amont comprend également PSI moniteurs qui permettent aux processus de l' espace utilisateur privilégié (comme lmkd ) pour spécifier des seuils pour ces retards et de souscrire à des événements du noyau lorsqu'un seuil est dépassé.

Moniteurs PSI par rapport aux signaux vmpressure

Parce que les vmpressure signaux (générés par le noyau pour la détection de la pression de mémoire et utilisés par lmkd ) comprennent souvent de nombreux faux positifs, lmkd doit effectuer un filtrage pour déterminer si la mémoire est sous pression réelle. Il en résulte inutiles lmkd redémarrages et l'utilisation des ressources informatiques supplémentaires. L'utilisation des moniteurs PSI permet une détection plus précise de la pression de la mémoire et minimise la surcharge de filtrage.

Utilisation des moniteurs PSI

Pour utiliser PSI moniteurs au lieu de vmpressure événements, configurez le ro.lmk.use_psi propriété. La valeur par défaut est true , ce qui rend les moniteurs de l' ISP le mécanisme par défaut de détection de pression de mémoire pour lmkd . Parce que les moniteurs PSI ont besoin de soutien noyau, le noyau doit inclure les patchs Backport PSI et être compilé avec le support PSI activé ( CONFIG_PSI=y ).

Inconvénients du pilote LMK intégré au noyau

Android désapprouve le pilote LMK en raison d'un certain nombre de problèmes, notamment :

  • Les périphériques à faible RAM devaient être réglés de manière agressive, et même alors, ils fonctionneraient mal sur les charges de travail avec un cache de page actif volumineux basé sur des fichiers. La mauvaise performance a entraîné une raclée et aucune mise à mort.
  • Le pilote du noyau LMK reposait sur des limites de mémoire libre, sans mise à l'échelle basée sur la pression de la mémoire.
  • En raison de la rigidité de la conception, les partenaires ont souvent personnalisé le pilote pour qu'il fonctionne sur leurs appareils.
  • Le conducteur de LMK accroché dans l'API dalle de shrinker, qui n'a pas été conçu pour les opérations lourdes telles que la recherche de cibles et de les tuer, ce qui ralentissait le vmscan processus.

Espace utilisateur lmkd

Le userspace lmkd met en œuvre les mêmes fonctionnalités que le pilote du noyau , mais utilise des mécanismes existants du noyau pour détecter et la pression de la mémoire estimation. Ces mécanismes comprennent l' utilisation du noyau généré vmpressure événements ou informations de décrochage de pression moniteurs (PSI) pour obtenir des notifications sur les niveaux de pression de la mémoire et l' utilisation des fonctions de CGroup mémoire pour limiter les ressources mémoire allouées à chaque processus en fonction de l' importance du processus.

Utilisation de l'espace utilisateur lmkd dans Android 10

Dans Android 9 et plus tard, le userspace lmkd active si un pilote de LMK dans le noyau n'est pas détecté. Parce que l' espace utilisateur lmkd nécessite le support noyau pour cgroups mémoire, le noyau doit être compilé avec les paramètres de configuration suivants:

CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y

Stratégies de mise à mort

Userspace lmkd supports tuent des stratégies basées sur vmpressure événements ou moniteurs PSI, leur gravité, et d' autres indices tels que l' utilisation de swap. Les stratégies d'élimination diffèrent entre les appareils à faible mémoire et les appareils hautes performances :

  • Sur les appareils à faible mémoire, le système doit tolérer une pression de mémoire plus élevée en tant que mode de fonctionnement normal.
  • Sur les appareils hautes performances, la pression de la mémoire doit être considérée comme une situation anormale et corrigée avant qu'elle n'affecte les performances globales.

Vous pouvez configurer la stratégie de tuer en utilisant la ro.config.low_ram propriété (pour plus de détails, voir faible RAM Configuration ).

Userspace lmkd prend également en charge un mode hérité dans lequel il prend des décisions de tuer en utilisant les mêmes stratégies que le pilote LMK dans le noyau (qui est, la mémoire libre et seuils cache de fichiers). Pour activer le mode héritage, définissez la ro.lmk.use_minfree_levels propriété à true .

Configuration de lmkd

Configurer lmkd pour un dispositif spécifique en utilisant les propriétés suivantes.

Biens Utilisation Défaut
ro.config.low_ram Spécifiez si le périphérique est un périphérique à faible RAM ou à hautes performances. false
ro.lmk.use_psi Utilisez les moniteurs PSI ( au lieu de vmpressure événements). true
ro.lmk.use_minfree_levels Utilisez des seuils de mémoire libre et de cache de fichiers pour prendre des décisions d'arrêt de processus (c'est-à-dire, faites correspondre la fonctionnalité du pilote LMK intégré au noyau). false
ro.lmk.low Le minimum oom_adj score pour les processus admissibles à tuer à faible vmpressure niveau. 1001
(désactivée)
ro.lmk.medium Le minimum oom_adj score pour les processus admissibles à être tué au moyen vmpressure niveau. 800
(services mis en cache ou non essentiels)
ro.lmk.critical Le minimum oom_adj score pour les processus admissibles à tuer au critique vmpressure niveau. 0
(tout processus)
ro.lmk.critical_upgrade Activer la mise à niveau au niveau critique. false
ro.lmk.upgrade_pressure Le maximum mem_pressure au cours de laquelle le niveau est mis à niveau parce que le système est trop swapping. 100
(désactivée)
ro.lmk.downgrade_pressure Le minimum mem_pressure auquel un vmpressure événement est ignoré car suffisamment de mémoire est toujours disponible. 100
(désactivée)
ro.lmk.kill_heaviest_task Tuez la tâche éligible la plus lourde (meilleure décision) par rapport à n'importe quelle tâche éligible (décision rapide). true
ro.lmk.kill_timeout_ms Durée en millisecondes après un kill lorsqu'aucun kill supplémentaire n'est effectué. 0
(désactivée)
ro.lmk.debug Activer lmkd journaux de débogage. false

Exemple de configuration d'appareil :

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

Espace utilisateur lmkd dans Android 11

Android 11 améliore la lmkd en introduisant une nouvelle stratégie de mise à mort. La stratégie tuant utilise un mécanisme de PSI pour la détection de la pression de mémoire introduite dans Android 10. lmkd dans Android 11 comptes pour les niveaux d'utilisation des ressources mémoire et raclée pour prévenir la famine de la mémoire et la dégradation des performances. Cette stratégie de mise à mort remplace les stratégies précédentes et peut être utilisée à la fois sur des appareils hautes performances et à faible mémoire vive (Android Go).

Exigences du noyau

Pour Android 11 appareils, lmkd requiert les fonctionnalités du noyau suivantes:

  • Incluez les correctifs PSI et activez PSI (backports disponibles dans les noyaux communs Android 4.9, 4.14 et 4.19).
  • Inclut les correctifs de prise en charge PIDFD (backports disponibles dans les noyaux communs Android 4.9, 4.14 et 4.19).
  • Pour les périphériques à faible RAM, incluez les groupes de contrôle de mémoire.

Le noyau doit être compilé avec les paramètres de configuration suivants :

CONFIG_PSI=y

Configuration de lmkd dans Android 11

La stratégie de suppression de la mémoire dans Android 11 prend en charge les boutons de réglage et les valeurs par défaut répertoriés ci-dessous. Ces fonctionnalités fonctionnent à la fois sur les appareils à hautes performances et à faible RAM.

Biens Utilisation Défaut
Haute performance Faible RAM
ro.lmk.psi_partial_stall_ms Le seuil de décrochage PSI partiel, en millisecondes, pour déclencher une notification de mémoire faible. Si l'appareil reçoit des notifications de pression de mémoire trop tard, diminuez cette valeur pour déclencher des notifications plus précoces. Si les notifications de pression de mémoire se déclenchent inutilement, augmentez cette valeur pour rendre l'appareil moins sensible au bruit. 70 200
ro.lmk.psi_complete_stall_ms Le seuil de décrochage PSI complet, en millisecondes, pour déclencher des notifications de mémoire critique. Si l'appareil reçoit des notifications de pression de mémoire critique trop tard, diminuez cette valeur pour déclencher des notifications plus précoces. Si des notifications de pression de mémoire critique se déclenchent inutilement, augmentez cette valeur pour rendre l'appareil moins sensible au bruit. 700
ro.lmk.thrashing_limit Le nombre maximal de défauts de l'ensemble de travail en pourcentage de la taille totale du cache de page sauvegardé sur fichier. Les défauts de Workingset au-dessus de cette valeur signifient que le système est considéré comme en train de détruire son cache de pages. Si les performances de l'appareil sont affectées pendant la pression de la mémoire, diminuez la valeur pour limiter le thrashing. Si les performances de l'appareil sont tuées inutilement pour des raisons de thrashing, augmentez la valeur pour permettre plus de thrashing. 100 30
ro.lmk.thrashing_limit_decay La décroissance du seuil d'écrasement exprimée en pourcentage du seuil d'origine utilisé pour abaisser le seuil lorsque le système ne récupère pas, même après une mise à mort. Si le thrashing continu produit des kills inutiles, diminuez la valeur. Si la réponse au thrashing continu après un kill est trop lente, augmentez la valeur. 10 50
ro.lmk.swap_util_max La quantité maximale de mémoire échangée en pourcentage de la mémoire échangeable totale. Lorsque la mémoire échangée dépasse cette limite, cela signifie que le système a échangé la majeure partie de sa mémoire échangeable et est toujours sous pression. Cela peut se produire lorsque des allocations non échangeables génèrent une pression sur la mémoire qui ne peut pas être soulagée par l'échange car la majeure partie de la mémoire échangeable est déjà échangée. La valeur par défaut est 100, ce qui désactive effectivement cette vérification. Si la performance de l'appareil est affecté pendant la pression de la mémoire tandis que l' utilisation de swap est élevée et le niveau d'échange libre ne baisse pas à ro.lmk.swap_free_low_percentage , diminuer la valeur pour limiter l' utilisation de swap. 100 100

Les anciens boutons de réglage suivants fonctionnent également avec la nouvelle stratégie de mise à mort.

Biens Utilisation Défaut
Haute performance Faible RAM
ro.lmk.swap_free_low_percentage Le niveau d'échange gratuit en pourcentage de l'espace d'échange total. `lmkd` utilise cette valeur comme seuil pour considérer le système comme un espace de swap en manque d'espace. Si `lmkd` tue alors qu'il y a trop d'espace dans le swap, diminuez le pourcentage. Si les kills `lmkd` se produisent trop tard, permettant aux kills OOM de se produire, augmentez le pourcentage. 20 10
ro.lmk.debug Cela active les journaux de débogage `lmkd`. Activez le débogage pendant le réglage. false