Daemon optimizador de poca memoria

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