El proceso de daemon del optimizador de poca memoria de Android (lmkd
) supervisa la memoria
estado de un sistema Android en ejecución y reacciona a la alta presión de la memoria eliminando
los procesos menos esenciales para mantener un rendimiento aceptable
niveles.
Información acerca de la presión de memoria
Un sistema Android que ejecuta múltiples procesos en paralelo puede experimentar situaciones en las que se agota la memoria del sistema y los procesos de memoria experimentan retrasos notables. Presión de memoria, un estado en el que la sistema se queda sin memoria, requiere que Android libere memoria (para aliviar la presión) limitando o eliminando procesos sin importancia, solicitando para liberar recursos almacenados en caché que no sean críticos, y así sucesivamente.
Históricamente, Android supervisó la presión de memoria del sistema a través de un kernel
de reducción de memoria (LMK), un mecanismo rígido que depende de código
de salida. A partir del kernel 4.12, se quita el controlador LMK del flujo ascendente
kernel y el espacio de usuario lmkd
supervisa la memoria y finaliza el proceso
tareas.
Información sobre la interrupción de presión
Android 10 y las versiones posteriores admiten un nuevo modo lmkd
que
Usa monitores de información de demora de presión (PSI) del kernel para la presión de memoria.
de detección de intrusiones. El conjunto de parches de PSI en el kernel upstream (con portabilidad a versiones anteriores a 4.9 y 4.14)
kernels) mide la cantidad de tiempo que las tareas se retrasan como resultado de
la escasez de memoria. Como estas demoras afectan directamente la experiencia del usuario,
representan una métrica conveniente para determinar la gravedad de la presión de la memoria. El
kernel upstream también incluye monitores PSI que permiten un espacio de usuario con privilegios
(como lmkd
) para especificar umbrales para estas demoras y
suscribirse a eventos del kernel cuando se traspasa un umbral.
Supervisión de PSI frente a indicadores de VMpress
Debido a que los indicadores vmpressure
(generados por el kernel para la memoria)
detección de presión y que lmkd
) suelen incluir varios falsos positivos,
lmkd
debe filtrar para determinar si la memoria está bajo presión real.
Como resultado, se generan activaciones lmkd
innecesarias y se usan
recursos de procesamiento. El uso de monitores PSI da como resultado una memoria más precisa
y minimiza la sobrecarga del filtrado.
Usa monitores de PSI
Para usar monitores de PSI en lugar de eventos de vmpressure
, configura el
propiedad ro.lmk.use_psi
. El valor predeterminado es true
, por lo que PSI supervisa
mecanismo predeterminado de detección de la presión de la memoria para lmkd
Dado que PSI supervisa
si requieren compatibilidad con kernel, este debe incluir los parches de portabilidad a versiones anteriores de PSI
se compilan con la compatibilidad con PSI habilitada (CONFIG_PSI=y
).
Desventajas del controlador LMK in-kernel
Android da de baja el controlador LMK debido a varios problemas, entre los que se incluyen los siguientes:
- Los dispositivos con poca RAM tuvieron que ajustarse drásticamente e incluso entonces tienen un rendimiento deficiente en cargas de trabajo con gran capacidad de almacenamiento en caché de páginas activa respaldada por archivos. El el rendimiento deficiente tuvo como resultado una hiperpaginación y ninguna muerte.
- El controlador del kernel del LMK se basaba en límites de memoria libre, sin escalamiento. según la presión de la memoria.
- Debido a la rigidez del diseño, los socios suelen personalizar el controlador. para que funcionara en sus dispositivos.
- El controlador LMK se enganchó a la API de slab reductor, que no fue
diseñados para operaciones pesadas, como la búsqueda de objetivos y asesinatos
lo que retrasó el proceso de
vmscan
.
LMKD de espacio del usuario
El lmkd
del espacio de usuario implementa la misma funcionalidad que el controlador del kernel
pero usa mecanismos de kernel existentes para detectar y estimar la presión de la memoria. Tales
Los mecanismos incluyen el uso de eventos vmpressure
generados por el kernel o bloqueos de presión.
de información (PSI) para recibir notificaciones sobre los niveles de presión de la memoria,
y usar funciones de cgroup de memoria para limitar los recursos de memoria asignados a cada
el proceso en función de su importancia.
Cómo usar el lmkd del espacio de usuario en Android 10
En Android 9 y versiones posteriores, el espacio de usuario lmkd
se activa si
no se detecta un controlador LMK en el kernel. Porque el espacio de usuario lmkd
requiere compatibilidad con el kernel para cgroups de memoria, el kernel debe compilarse con el
los siguientes parámetros de configuración:
CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y
Estrategias de eliminación
El espacio de usuario lmkd
admite estrategias de eliminación en función de eventos de vmpressure
o PSI.
de supervisión, su gravedad
y otras sugerencias, como el uso de intercambio. Matar
difieren entre dispositivos de memoria baja y dispositivos de alto rendimiento:
- En dispositivos con poca memoria, el sistema debería tolerar una presión de memoria más alta como y el modo de funcionamiento normal.
- En dispositivos de alto rendimiento, la presión de memoria debe considerarse como un resultado anormal. y corregirse antes de que afecte el rendimiento general.
Puedes configurar la estrategia de cierre con la propiedad ro.config.low_ram
. Para
detalles, consulta RAM baja
actual.
El espacio de usuario lmkd
también admite un modo heredado en el que toma decisiones finales
con las mismas estrategias que el controlador LMK in-kernel (es decir,
los umbrales de caché de archivos y de memoria). Para habilitar el modo heredado, configura la
propiedad ro.lmk.use_minfree_levels
a true
.
Configurar lmkd
Configura lmkd
para un dispositivo específico con las siguientes propiedades.
Propiedad | Usar | Predeterminado |
---|---|---|
ro.config.low_ram
|
Especifica si el dispositivo es de alto rendimiento o con poca RAM. | false
|
ro.lmk.use_psi |
Usa monitores PSI (en lugar de eventos vmpressure ). |
true |
ro.lmk.use_minfree_levels
|
Usar los umbrales de memoria libre y caché de archivos para finalizar el proceso decisiones (es decir, coincidir con la funcionalidad del kernel controlador de LMK). | false
|
ro.lmk.low
|
La puntuación mínima de oom_adj para los procesos que son aptos para lo siguiente:
muertes en un nivel bajo de vmpressure .
|
1001 (inhabilitado) |
ro.lmk.medium
|
La puntuación mínima de oom_adj para los procesos que son aptos para lo siguiente:
ha finalizado en un nivel medio de vmpressure .
|
800 (servicios almacenados en caché o no esenciales) |
ro.lmk.critical
|
La puntuación mínima de oom_adj para los procesos que son aptos para lo siguiente:
murió a un nivel crítico de vmpressure .
|
0 (cualquier proceso) |
ro.lmk.critical_upgrade
|
Habilita la actualización al nivel crítico. | false
|
ro.lmk.upgrade_pressure
|
La cantidad máxima de mem_pressure en la que se actualiza el nivel
porque el sistema realiza demasiados intercambios.
|
100 (inhabilitado) |
ro.lmk.downgrade_pressure
|
El mem_pressure mínimo en el que un vmpressure
se ignora porque todavía hay suficiente memoria libre disponible.
|
100 (inhabilitado) |
ro.lmk.kill_heaviest_task
|
Eliminar la tarea apta más pesada (mejor decisión) en comparación con cualquier tarea apta (decisión rápida). | true
|
ro.lmk.kill_timeout_ms
|
Duración en milisegundos después de una destrucción cuando no se produce ninguna eliminación adicional listo. | 0 (inhabilitado) |
ro.lmk.debug
|
Habilita los registros de depuración de lmkd .
|
false
|
Ejemplo de configuración del dispositivo:
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
LMKD de espacio del usuario en Android 11
Android 11 mejora la lmkd
con la incorporación de un nuevo
de maquinaria expansiva. La estrategia de cierre usa un mecanismo de PSI para medir la presión en la memoria
del sistema se introdujo en Android 10. lmkd
in
Android 11 considera los niveles de uso de recursos de memoria
y la hiperpaginación para prevenir la falta de memoria y la degradación del rendimiento.
Esta estrategia alternativa reemplaza las estrategias anteriores y puede utilizarse tanto en
dispositivos de alto rendimiento y con poca RAM (Android Go).
Requisitos del kernel
Para dispositivos con Android 11, lmkd
requiere las siguientes funciones de kernel:
- Incluye parches de PSI y habilita PSI (backports disponibles en Kernel comunes de Android 4.9, 4.14 y 4.19)
- Incluir parches de compatibilidad con PIDFD (backports disponibles en las versiones comunes de Android kernels 4.9, 4.14 y 4.19).
- Para dispositivos con poca RAM, incluye cgroups de memoria.
El kernel debe compilarse con los siguientes ajustes de configuración:
CONFIG_PSI=y
Cómo configurar lmkd en Android 11
La estrategia de eliminación de memoria en Android 11 admite los controles de ajuste y los valores predeterminados que aparecen a continuación. Estas funciones funcionan tanto de alto rendimiento y con poca RAM.
Propiedad | Usar | Predeterminado | |
---|---|---|---|
Alto rendimiento | RAM baja | ||
ro.lmk.psi_partial_stall_ms |
El umbral de inactividad parcial de PSI, en milisegundos, para activar la baja notificación de memoria. Si el dispositivo recibe notificaciones de presión de memoria demasiado tarde, disminuye este valor para activar notificaciones más temprano. Si la memoria las notificaciones de presión se activan innecesariamente, aumenta este valor para hacer que el dispositivo sea menos sensible al ruido. | 70 |
200 |
ro.lmk.psi_complete_stall_ms |
El umbral completo de bloqueo de PSI, en milisegundos, para la activación las notificaciones de memoria crítica. Si el dispositivo recibe memoria crítica las notificaciones de presión demasiado tarde, reduce este valor para que se active antes notificaciones. Si se activan las notificaciones de presión de memoria crítica innecesariamente, aumenta este valor para que el dispositivo sea menos sensible ruido de fondo. | 700 |
|
ro.lmk.thrashing_limit |
La cantidad máxima de novedades del conjunto de tareas como un porcentaje del total el tamaño de la caché de las páginas respaldadas por archivos. Las referencias del conjunto de tareas por encima de este valor significan que se considera que el sistema está hiperpaginando su caché de páginas. Si el botón el rendimiento del dispositivo se ve afectado durante la presión de la memoria, disminuir el valor para limitar la hiperpaginación Si se interrumpe el rendimiento del dispositivo innecesariamente por razones de hiperpaginación, aumente el valor para permitir más la hiperpaginación | 100 |
30 |
ro.lmk.thrashing_limit_decay |
La disminución del umbral de hiperpaginación expresada como un porcentaje del umbral original que se usa para reducir el umbral cuando el sistema no recuperarse, incluso después de una muerte. Si la hiperpaginación continua produce una mata, disminuye el valor. Si la respuesta a la hiperpaginación continua después de si la muerte es demasiado lenta, aumenta el valor. | 10 |
50 |
ro.lmk.swap_util_max |
La cantidad máxima de memoria intercambiable como un porcentaje del total de dispositivos intercambiables
memoria. Cuando la memoria intercambiada supera este límite, significa que
cambió la mayor parte de su memoria intercambiable
y aún está bajo presión.
Esto puede ocurrir cuando las asignaciones no intercambiables generan memoria
presión que no se puede aliviar con el cambio porque la mayoría de los componentes
ya se haya intercambiado la memoria. El valor predeterminado es 100,
inhabilita esta verificación. Si el rendimiento del dispositivo se ve afectado durante
la presión de memoria mientras el uso de intercambio es alto y el nivel de intercambio
no baja a ro.lmk.swap_free_low_percentage , disminuir
el valor para limitar el uso del intercambio. |
100 |
100 |
Los siguientes controles de ajuste antiguos también funcionan con la nueva estrategia de cierre.
Propiedad | Usar | Predeterminado | |
---|---|---|---|
Alto rendimiento | RAM baja | ||
ro.lmk.swap_free_low_percentage |
Nivel de intercambio libre como porcentaje del espacio de intercambio total. "lmkd" usa este valor como umbral para determinar cuándo considerar el sistema como una sin espacio. Si `lmkd` finaliza mientras hay demasiado espacio en el intercambio, disminuir el porcentaje. Si las operaciones de "lmkd" ocurren demasiado tarde, se permite de muertes, aumenta el porcentaje. | 20 |
10 |
ro.lmk.debug |
Esto habilita los registros de depuración “lmkd”. Habilitar la depuración durante el ajuste | false |