Le processus daemon (lmkd
) du tueur de mémoire faible Android surveille la mémoire.
l'état d'un système Android en cours d'exécution et réagit à la pression exercée sur la mémoire
les processus les moins essentiels pour maintenir
le fonctionnement du système à un niveau acceptable
et des niveaux de service.
À propos de la pression sur la mémoire
Un système Android exécutant plusieurs processus en parallèle peut rencontrer les situations où la mémoire système est épuisée et les processus nécessitant la mémoire connaissent des retards notables. Pression sur la mémoire : état dans lequel manque de mémoire, Android doit libérer de la mémoire (pour réduire la pression) en limitant ou en supprimant des processus sans importance, en demandant des processus pour libérer les ressources non critiques mises en cache, et ainsi de suite.
Auparavant, Android contrôlait la pression de la mémoire système à l'aide d'un noyau
le pilote de cache de mémoire faible (LMK, LowMemory killer), un mécanisme rigide qui dépend d'un pipeline
valeurs. À partir de la version 4.12 du noyau, le pilote LMK est supprimé du répertoire
le noyau et l'espace utilisateur lmkd
surveillent la mémoire et suppriment des processus.
tâches.
Informations sur les blocages de pression
Android 10 et versions ultérieures sont compatibles avec un nouveau mode lmkd
qui
utilise des informations de blocage de pression du noyau (PSI) surveille la pression sur la mémoire
la détection automatique. Ensemble de correctifs PSI dans le noyau en amont (rétroporté vers les versions 4.9 et 4.14)
noyaux) mesure la durée pendant laquelle les tâches sont retardées en raison
les pénuries de mémoire. Comme ces retards ont une incidence directe sur l'expérience utilisateur,
sont une métrique pratique pour déterminer
la gravité de la pression sur la mémoire. La
Le noyau en amont inclut également des moniteurs PSI qui permettent à l’espace utilisateur privilégié
(lmkd
, par exemple) pour spécifier des seuils pour ces délais
s'abonnent aux événements du noyau
lorsqu'un seuil est dépassé.
Surveillance PSI et signaux vmpressure
Comme les signaux vmpressure
(générés par le noyau pour la mémoire)
et utilisée par les lmkd
) incluent souvent de nombreux faux positifs,
lmkd
doit effectuer un filtrage pour déterminer si la mémoire est soumise à une pression réelle.
Cela se traduit par des wakeups lmkd
inutiles et l'utilisation d'autres
en ressources de calcul. L'utilisation de la surveillance PSI améliore la précision de la mémoire
la détection de la pression et réduit
les frais généraux de filtrage.
Utiliser des moniteurs PSI
Pour utiliser des moniteurs PSI au lieu d'événements vmpressure
, configurez
ro.lmk.use_psi
. La valeur par défaut est true
, ce qui signifie que PSI surveille
mécanisme par défaut de détection de la pression sur la mémoire pour lmkd
. Comme PSI surveille
prise en charge par le noyau, celui-ci doit inclure les correctifs de rétroportage PSI et être
compilé avec la compatibilité PSI activée (CONFIG_PSI=y
).
Inconvénients du pilote LMK intégré au noyau
Android abandonne le pilote LMK en raison d'un certain nombre de problèmes, y compris les suivants:
- Les appareils à faible RAM devaient être réglés de manière agressive, et même dans ce cas, sont peu performantes sur les charges de travail comportant de grands caches de pages actifs sauvegardés dans des fichiers. La de mauvaises performances ont entraîné le thrashing et l'absence de mise à mort.
- Le pilote du noyau LMK reposait sur les limites de mémoire libre, sans scaling basé sur sur la pression de la mémoire.
- En raison de la rigidité de la conception, les partenaires ont souvent personnalisé le haut-parleur pour qu'elle fonctionne sur leurs appareils.
- Le pilote LMK était associé à l'API réducteur de dalles, qui n'était pas
conçu pour des opérations lourdes, comme rechercher des cibles et tuer
eux, ce qui a ralenti le processus
vmscan
.
Espace utilisateur lmkd
L'espace utilisateur lmkd
implémente les mêmes fonctionnalités que le pilote intégré au noyau.
mais il utilise les mécanismes de noyau existants
pour détecter et estimer la pression sur la mémoire. Telles
les mécanismes incluent l'utilisation d'événements vmpressure
générés par le noyau ou d'un blocage de pression
informations (PSI) surveille pour obtenir des notifications
sur les niveaux de pression de la mémoire,
et utiliser les fonctionnalités de cgroup de mémoire pour limiter les ressources de mémoire allouées à chaque
en fonction de l'importance du processus.
Utiliser l'espace utilisateur lmkd dans Android 10
Sous Android 9 ou version ultérieure, l'espace utilisateur lmkd
s'active si
qu'aucun pilote LMK intégré n'est détecté. Comme l'espace utilisateur lmkd
nécessite la prise en charge du noyau pour les cgroups de mémoire, celui-ci doit être compilé avec le
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 des événements vmpressure
ou PSI
que surveille, leur gravité et d'autres indications telles que l'utilisation de l'échange. Tuer
stratégies diffèrent selon qu'ils disposent d'une faible capacité de mémoire ou d'appareils hautes performances:
- Sur les appareils à faible mémoire, le système doit tolérer une pression plus élevée sur la mémoire en mode normal.
- Sur les appareils hautes performances, la pression sur la mémoire doit être considérée comme une 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
. Pour
consultez la section Mémoire RAM faible
configuration.
L'espace utilisateur lmkd
est également compatible avec un ancien mode dans lequel il prend des décisions d'arrêt.
en utilisant les mêmes stratégies que le pilote LMK intégré (c'est-à-dire sans frais
de mémoire et de cache de fichiers). Pour activer l'ancien mode, définissez
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
|
Spécifiez s'il s'agit d'un appareil à mémoire RAM faible ou hautes performances. | false
|
ro.lmk.use_psi |
Utilisez des moniteurs PSI (au lieu des événements vmpressure ). |
true |
ro.lmk.use_minfree_levels
|
Utiliser les seuils de mémoire disponible et de cache de fichiers pour arrêter le processus (c'est-à-dire, correspondre à la fonctionnalité pilote LMK). | false
|
ro.lmk.low
|
Score minimal de oom_adj pour les processus éligibles
tué à un niveau vmpressure bas.
|
1001 (désactivé) |
ro.lmk.medium
|
Score minimal de oom_adj pour les processus éligibles
tué au niveau moyen vmpressure .
|
800 (services non essentiels ou mis en cache) |
ro.lmk.critical
|
Score minimal de oom_adj pour les processus éligibles
supprimée au niveau critique de vmpressure .
|
0 (tout processus) |
ro.lmk.critical_upgrade
|
Activez la mise à niveau vers le niveau critique. | false
|
ro.lmk.upgrade_pressure
|
Montant maximal de mem_pressure auquel le niveau est mis à niveau
parce que le système
effectue trop d’échanges.
|
100 (désactivé) |
ro.lmk.downgrade_pressure
|
mem_pressure minimum auquel une vmpressure
est ignoré, car il reste suffisamment de mémoire disponible.
|
100 (désactivé) |
ro.lmk.kill_heaviest_task
|
Tuer la tâche éligible la plus lourde (meilleure décision) par rapport à toute tâche éligible (prise de décision rapide). | true
|
ro.lmk.kill_timeout_ms
|
Durée en millisecondes après une arrêt lorsqu'aucune autre exécution n'est terminé. | 0 (désactivé) |
ro.lmk.debug
|
Activez 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 sous Android 11
Android 11 améliore lmkd
en introduisant une nouvelle
stratégie de mise à l'arrêt. La stratégie d'arrêt utilise un mécanisme PSI pour la pression sur la mémoire
de sécurité introduite dans Android 10. lmkd
po
Android 11 prend en compte les niveaux d'utilisation des ressources de mémoire
et le thrashing pour éviter la pénurie
de mémoire et la dégradation des performances.
Cette stratégie de suppression remplace les stratégies précédentes et peut être utilisée à la fois
hautes performances à 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 (les rétroportages disponibles dans noyaux Android courants 4.9, 4.14 et 4.19).
- Incluez des correctifs de prise en charge PIDFD (rétroportages disponibles dans les noyaux 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'élimination de la mémoire dans Android 11 prend en charge les boutons de réglage et les valeurs par défaut listés ci-dessous. Ces fonctionnalités sont à la fois hautes performances à 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 le déclenchement de notification concernant la mémoire. Si l'appareil reçoit des notifications concernant la pression de la mémoire trop tard, diminuez cette valeur pour déclencher des notifications plus tôt. Si la mémoire les notifications de pression se déclenchent inutilement, augmentez cette valeur pour l'appareil est moins sensible au bruit. | 70 |
200 |
ro.lmk.psi_complete_stall_ms |
Seuil de blocage PSI complet, en millisecondes, pour le déclenchement les notifications de mémoire critique. Si l'appareil reçoit de la mémoire critique notifications de pression trop tardives, diminuez cette valeur pour les déclencher plus tôt les notifications. Si les notifications de pression critique de la mémoire se déclenchent inutilement, augmentez cette valeur pour rendre l'appareil moins sensible bruit. | 700 |
|
ro.lmk.thrashing_limit |
Nombre maximal de réf. d'ensembles de travail, sous forme de pourcentage du total taille du cache de page sauvegardée dans un fichier. La moyenne des valeurs de référence des ensembles de travail supérieures à cette valeur que le système est considéré comme le thrashing de son pagecache. Si le les performances de l'appareil sont affectées lorsque la mémoire est sollicitée, une diminution pour limiter le thrashing. Si les performances de l'appareil sont interrompues inutilement pour des raisons de thrashing, augmentez la valeur pour permettre du thrashing. | 100 |
30 |
ro.lmk.thrashing_limit_decay |
La dépréciation du seuil de thrashing, exprimée en pourcentage du seuil initial utilisé pour abaisser le seuil lorsque le système ne récupérer, même après une mort. Si le thrashing continu produit kills, diminuez la valeur. Si la réponse à un thrashing continu après kill est trop lente, augmentez la valeur. | 10 |
50 |
ro.lmk.swap_util_max |
Quantité maximale de mémoire échangée, exprimée en pourcentage du total d'éléments interchangeables
mémoire. Lorsque la mémoire échangée dépasse cette limite, cela signifie que
a remplacé la majeure partie de sa mémoire interchangeables et il est toujours sous pression.
Cela peut se produire lorsque des allocations non interchangeables génèrent de la mémoire
une pression qui ne peut pas être relâchée par un échange, car la plupart
la mémoire est déjà échangée. La valeur par défaut est 100, ce qui signifie
désactive cette vérification. Si les performances de l'appareil sont affectées pendant
la pression sur la mémoire alors que l'utilisation des échanges est élevée et le niveau d'échange libre
ne chute pas à ro.lmk.swap_free_low_percentage , diminuez
la valeur permettant de limiter l'utilisation de l'é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'échange libre, exprimé en pourcentage de l'espace d'échange total. "lmkd" utilise cette valeur comme seuil pour déterminer quand considérer le système comme un échange manque d'espace. Si "lmkd" se tue alors qu'il y a trop d'espace dans l'échange, réduire le pourcentage. Si les exécutions "lmkd" se produisent trop tard, ce qui autorise OOM d'arrêts d'exécution, augmentez le pourcentage. | 20 |
10 |
ro.lmk.debug |
Cela active les journaux de débogage "lmkd". Activer le débogage pendant le réglage | false |