Le processus daemon (lmkd) du tueur de mémoire faible Android surveille l'état de la mémoire d'un système Android en cours d'exécution et réagit à une forte sollicitation de la mémoire en arrêtant les processus les moins essentiels pour que le système continue de fonctionner à des niveaux acceptables.
À propos de la sollicitation 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 où les processus nécessitant plus de mémoire subissent des retards notables. La sollicitation de la mémoire, état dans lequel le système manque de mémoire, nécessite qu'Android libère de la mémoire (pour atténuer la sollicitation) en limitant ou en arrêtant les processus non importants, en demandant aux processus de libérer les ressources mises en cache non critiques, etc.
Auparavant, Android surveillait la sollicitation de la mémoire système à l'aide d'un pilote de tueur de mémoire faible (LMK) intégré au noyau, un mécanisme rigide qui dépend de valeurs codées en dur. À partir du noyau 4.12, le pilote LMK est supprimé du noyau en amont et l'espace utilisateur lmkd effectue des tâches de surveillance de la mémoire et d'arrêt des processus.
Informations sur la pression de blocage
Android 10 et versions ultérieures sont compatibles avec un nouveau mode lmkd qui utilise des moniteurs d'informations sur la pression de blocage (PSI) du noyau pour détecter la sollicitation de la mémoire. Le patchset 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 d'un manque de mémoire. Comme ces retards affectent directement l'expérience utilisateur, ils représentent une métrique pratique pour déterminer la gravité de la sollicitation de la mémoire. Le noyau en amont inclut également des moniteurs PSI qui permettent aux processus d'espace utilisateur privilégiés (tels que lmkd) de spécifier des seuils pour ces retards et de s'abonner aux événements du noyau lorsqu'un seuil est dépassé.
Moniteurs PSI par rapport aux signaux vmpressure
Étant donné que les signaux vmpressure (générés par le noyau pour la détection de la sollicitation de la mémoire et utilisés par lmkd) incluent souvent de nombreux faux positifs, lmkd doit effectuer un filtrage pour déterminer si la mémoire est réellement sollicitée.
Cela entraîne des réveils lmkd inutiles et l'utilisation de ressources de calcul supplémentaires. L'utilisation de moniteurs PSI permet une détection plus précise de la sollicitation de la mémoire et minimise la surcharge de filtrage.
Utiliser des moniteurs PSI
Pour utiliser des moniteurs PSI au lieu d'événements vmpressure, configurez la propriété ro.lmk.use_psi. La valeur par défaut est true, ce qui fait des moniteurs PSI le mécanisme par défaut de détection de la sollicitation de la mémoire pour lmkd. Étant donné que les moniteurs PSI nécessitent une prise en charge du noyau, celui-ci doit inclure les correctifs de rétroportage PSI et être compilé avec la prise en charge PSI activée (CONFIG_PSI=y).
Inconvénients du pilote LMK intégré au noyau
Android déconseille le pilote LMK en raison d'un certain nombre de problèmes, dont les suivants :
- Les appareils à faible RAM devaient être réglés de manière agressive, et même dans ce cas, leurs performances étaient médiocres sur les charges de travail avec un cache de page actif volumineux. Les mauvaises performances ont entraîné un battement et aucun arrêt.
- Le pilote de noyau LMK s'appuyait sur des limites de mémoire libre, sans mise à l'échelle basée sur la sollicitation de la mémoire.
- En raison de la rigidité de la conception, les partenaires personnalisaient souvent le pilote pour qu'il fonctionne sur leurs appareils.
- Le pilote LMK s'est connecté à l'API de réduction de slab, qui n'était pas conçue pour les opérations lourdes telles que la recherche de cibles et leur arrêt, ce qui a ralenti le processus
vmscan.
Espace utilisateur lmkd
L'espace utilisateur lmkd implémente la même fonctionnalité que le pilote intégré au noyau, mais utilise les mécanismes de noyau existants pour détecter et estimer la sollicitation de la mémoire. Ces mécanismes incluent l'utilisation d'événements vmpressure générés par le noyau ou de moniteurs d'informations sur la pression de blocage (PSI) pour recevoir des notifications sur les niveaux de sollicitation de la mémoire, et l'utilisation de fonctionnalités de cgroup de mémoire pour limiter les ressources de mémoire allouées à chaque processus en fonction de son importance.
Utiliser l'espace utilisateur lmkd dans Android 10
Dans Android 9 et versions ultérieures, l'espace utilisateur lmkd s'active si aucun pilote LMK intégré au noyau n'est détecté. Étant donné que l'espace utilisateur lmkd nécessite une prise en charge du noyau pour les cgroups de 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 d'arrêt
L'espace utilisateur lmkd est compatible avec les stratégies d'arrêt basées sur les événements vmpressure ou les moniteurs PSI, leur gravité et d'autres indications telles que l'utilisation de l'espace d'échange. Les stratégies d'arrêt 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 sollicitation de la mémoire plus élevée en mode de fonctionnement normal.
- Sur les appareils hautes performances, la sollicitation 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 d'arrêt à l'aide de la propriété ro.config.low_ram.
L'espace utilisateur lmkd est également compatible avec un mode hérité dans lequel il prend des décisions d'arrêt en utilisant les mêmes stratégies que le pilote LMK intégré au noyau (c'est-à-dire les seuils de mémoire libre et de cache de fichiers). Pour activer le mode hérité, définissez la propriété ro.lmk.use_minfree_levels sur true.
Configurer lmkd
Configurez lmkd pour un appareil spécifique à l'aide des propriétés suivantes.
| Propriété | Utiliser | Par défaut |
|---|---|---|
ro.config.low_ram
|
Indiquez si l'appareil est un appareil à faible mémoire ou un appareil hautes performances. | false
|
ro.lmk.use_psi |
Utilisez des moniteurs PSI (au lieu d'événements vmpressure). |
true |
ro.lmk.use_minfree_levels
|
Utilisez les 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
|
Score oom_adj minimal pour les processus pouvant être
arrêtés à un faible niveau vmpressure.
|
1001(désactivé) |
ro.lmk.medium
|
Score oom_adj minimal pour les processus pouvant être
arrêtés à un niveau vmpressure moyen.
|
800(services mis en cache ou non essentiels) |
ro.lmk.critical
|
Score oom_adj minimal pour les processus pouvant être
arrêtés à un niveau vmpressure critique.
|
0(n'importe quel processus) |
ro.lmk.critical_upgrade
|
Activer la mise à niveau vers le niveau critique. | false
|
ro.lmk.upgrade_pressure
|
`mem_pressure` maximal auquel le niveau est mis à niveau
car le système échange trop de données.mem_pressure
|
100(désactivé) |
ro.lmk.downgrade_pressure
|
`mem_pressure` minimal auquel un événement vmpressure
est ignoré, car suffisamment de mémoire libre est encore disponible.mem_pressure
|
100(désactivé) |
ro.lmk.kill_heaviest_task
|
Arrêtez la tâche éligible la plus lourde (meilleure décision) plutôt que n'importe quelle tâche éligible (décision rapide). | false
|
ro.lmk.kill_timeout_ms
|
Durée en millisecondes après un arrêt pendant laquelle aucun arrêt supplémentaire n'est effectué. | 0(désactivé) |
ro.lmk.debug
|
Activer les journaux de débogage lmkd.
|
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 lmkd en introduisant une nouvelle stratégie d'arrêt. La stratégie d'arrêt utilise un mécanisme PSI pour la détection de la sollicitation de la mémoire introduit dans Android 10. lmkd dans Android 11 tient compte des niveaux d'utilisation des ressources de mémoire et du battement pour éviter la saturation de la mémoire et la dégradation des performances.
Cette stratégie d'arrêt remplace les stratégies précédentes et peut être utilisée sur les appareils hautes performances et à faible RAM (Android Go).
Exigences du noyau
Pour les appareils Android 11, lmkd nécessite les fonctionnalités de noyau suivantes :
- Incluez les correctifs PSI et activez PSI (rétroportages disponibles dans les noyaux communs Android 4.9, 4.14 et 4.19).
- Incluez les correctifs de prise en charge PIDFD (rétroportages disponibles dans les noyaux communs Android 4.9, 4.14 et 4.19).
- Pour les appareils à faible RAM, incluez des cgroups de mémoire.
Le noyau doit être compilé avec les paramètres de configuration suivants :
CONFIG_PSI=y
Configurer lmkd dans Android 11
La stratégie d'arrêt de la mémoire dans Android 11 est compatible avec les boutons de réglage et les valeurs par défaut listés ci-dessous. Ces fonctionnalités fonctionnent sur les appareils hautes performances et à faible RAM.
| Propriété | Utiliser | Par défaut | |
|---|---|---|---|
| Hautes performances | Faible RAM | ||
ro.lmk.psi_partial_stall_ms |
Seuil de blocage PSI partiel, en millisecondes, pour déclencher une notification de mémoire faible. Si l'appareil reçoit des notifications de sollicitation de la mémoire trop tard, diminuez cette valeur pour déclencher des notifications plus tôt. Si les notifications de sollicitation de la 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 |
Seuil de blocage PSI complet, en millisecondes, pour déclencher des notifications de mémoire critique. Si l'appareil reçoit des notifications de sollicitation de la mémoire critique trop tard, diminuez cette valeur pour déclencher des notifications plus tôt. Si les notifications de sollicitation de la mémoire critique se déclenchent inutilement, augmentez cette valeur pour rendre l'appareil moins sensible au bruit. | 700 |
|
ro.lmk.thrashing_limit |
Quantité maximale de défauts de fonctionnement en pourcentage de la taille totale du cache de page sauvegardé sur fichier. Les défauts de fonctionnement supérieurs à cette valeur signifient que le système est considéré comme battant son cache de page. Si les performances de l'appareil sont affectées pendant la sollicitation de la mémoire, diminuez la valeur pour limiter le battement. Si les performances de l'appareil sont arrêtées inutilement pour des raisons de battement, augmentez la valeur pour autoriser davantage de battement. | 100 |
30 |
ro.lmk.thrashing_limit_decay |
Décroissance du seuil de battement 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 un arrêt. Si le battement continu entraîne des arrêts inutiles, diminuez la valeur. Si la réponse au battement continu après un arrêt est trop lente, augmentez la valeur. | 10 |
50 |
ro.lmk.swap_util_max |
Quantité maximale de mémoire échangée en pourcentage de la mémoire échangeable totale
mémoire. Lorsque la mémoire échangée dépasse cette limite, cela signifie que le
système a échangé la plus grande partie de sa mémoire échangeable et qu'il est toujours sollicité.
Cela peut se produire lorsque des allocations non échangeables génèrent une sollicitation de la mémoire
qui ne peut pas être soulagée par l'échange, car la plus grande 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 les performances de l'appareil sont affectées pendant
la sollicitation de la mémoire alors que l'utilisation de l'espace d'échange est élevée et que le niveau d'espace d'échange libre
ne diminue pas à ro.lmk.swap_free_low_percentage, diminuez
la valeur pour limiter l'utilisation de l'espace d'échange. |
100 |
100 |
Les anciens boutons de réglage suivants fonctionnent également avec la nouvelle stratégie d'arrêt.
| Propriété | Utiliser | Par défaut | |
|---|---|---|---|
| Hautes performances | Faible RAM | ||
ro.lmk.swap_free_low_percentage |
Niveau d'espace d'échange libre en pourcentage de l'espace d'échange total. `lmkd` utilise cette valeur comme seuil pour déterminer quand le système est considéré comme manquant d'espace d'échange. Si `lmkd` s'arrête alors qu'il y a trop d'espace dans l'espace d'échange, diminuez le pourcentage. Si `lmkd` s'arrête trop tard, ce qui permet aux arrêts 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 |
|