Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Demonio asesino de poca memoria

El androide memoria baja asesino daemon ( lmkd monitores de proceso) el estado de la memoria de un sistema de Android corriendo y reacciona a la presión de memoria alta, matando a los procesos de mínimos esenciales para mantener el sistema funcionando a niveles aceptables.

Sobre la presión de la memoria

Un sistema Android que ejecuta múltiples procesos en paralelo puede encontrar situaciones en las que la memoria del sistema se agota y los procesos que requieren más memoria experimentan retrasos notables. Presión de memoria, un estado en el que el sistema está funcionando en la memoria corta, requiere Android para liberar memoria (para aliviar la presión) por estrangulación o matar procesos sin importancia, solicitando procesos para liberar recursos en caché no críticos, y así sucesivamente.

Históricamente, Android supervisaba la presión de la memoria del sistema mediante un controlador de eliminación de memoria baja (LMK) en el kernel, un mecanismo rígido que depende de valores codificados de forma rígida. A partir del kernel 4.12, el conductor LMK es eliminado del núcleo aguas arriba y el espacio de usuario lmkd monitoreo de memoria y realiza tareas de proceso de matar.

Información de pérdida de presión

Android 10 y más tarde apoyar un nuevo lmkd modo que los usos del kernel de información puesto de presión (PSI) monitores para la detección de la presión de memoria. El conjunto de parches PSI en el kernel ascendente (retroportado a los kernels 4.9 y 4.14) mide la cantidad de tiempo que las tareas se retrasan como resultado de la escasez de memoria. Dado que estos retrasos afectan directamente la experiencia del usuario, representan una métrica conveniente para determinar la gravedad de la presión de la memoria. El kernel también incluye monitores PSI que permiten los procesos de usuario con privilegios (como lmkd ) para especificar umbrales para estos retrasos y para suscribirse a los eventos desde el núcleo cuando se viola un umbral.

Monitores PSI versus señales de presión

Debido a que los vmpressure señales (generados por el núcleo para la detección de presión de la memoria y utilizados por lmkd ) a menudo incluyen numerosos falsos positivos, lmkd debe realizar el filtrado para determinar si la memoria está bajo presión real. Este resultado en innecesarias lmkd activaciones y el uso de los recursos computacionales adicionales. El uso de monitores PSI da como resultado una detección de presión de memoria más precisa y minimiza la sobrecarga de filtrado.

Usar monitores PSI

Para utilizar monitores de la ISP en lugar de vmpressure eventos, configure el ro.lmk.use_psi propiedad. El valor predeterminado es true , haciendo monitores PSI el mecanismo predeterminado de detección de presión de la memoria para lmkd . Porque los monitores de la ISP requieren soporte en el núcleo, el núcleo debe incluir los parches de backport psi y ser compilado con soporte PSI habilitada ( CONFIG_PSI=y ).

Inconvenientes del controlador LMK en el kernel

Android desaprueba el controlador LMK debido a una serie de problemas, que incluyen:

  • Los dispositivos con poca RAM tenían que ajustarse agresivamente, e incluso entonces tendrían un rendimiento deficiente en cargas de trabajo con gran caché de página activo respaldado por archivos. El mal desempeño resultó en goleadas y sin muertes.
  • El controlador del kernel LMK se basó en los límites de memoria libre, sin escalado basado en la presión de la memoria.
  • Debido a la rigidez del diseño, los socios a menudo personalizaban el controlador para que funcionara en sus dispositivos.
  • El conductor LMK enganchado en la API shrinker losa, que no fue diseñado para operaciones pesadas, tales como la búsqueda de objetivos y matarlos, lo que frenó el vmscan proceso.

Espacio de usuario lmkd

El espacio de usuario lmkd implementa la misma funcionalidad que el controlador del núcleo, pero utiliza mecanismos del núcleo existentes para detectar y presión de memoria estimación. Tales mecanismos incluyen el uso generada kernel- vmpressure eventos o información de puesto de presión (PSI) monitores para recibir notificaciones acerca de los niveles de presión de memoria, y utilizar las funciones cgroup memoria para limitar los recursos de memoria asignados a cada proceso basado en la importancia del proceso.

Usando el espacio de usuario lmkd en Android 10

En Android 9 y posterior, el espacio de usuario lmkd se activa si no se detecta un controlador LMK en el núcleo. Debido a que el espacio de usuario lmkd requiere soporte del kernel para cgroups memoria, el núcleo debe ser compilado con los ajustes de configuración siguiente:

CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y

Matar estrategias

El espacio de usuario lmkd soportes matan estrategias basadas en vmpressure eventos o monitores PSI, su gravedad y otras indirectas, como la utilización de intercambio. Las estrategias de eliminación difieren entre dispositivos de baja memoria y de alto rendimiento:

  • En dispositivos con poca memoria, el sistema debe tolerar una mayor presión de memoria como modo normal de funcionamiento.
  • En los dispositivos de alto rendimiento, la presión de la memoria debe verse como una situación anormal y corregirse antes de que afecte al rendimiento general.

Puede configurar la estrategia de matar mediante el ro.config.low_ram propiedad (para más detalles, véase Configuración Nivel bajo de RAM ).

El espacio de usuario lmkd también soporta un modo de herencia en la que toma las decisiones Kill utilizando las mismas estrategias que el conductor LMK en el núcleo (es decir, memoria libre y archivo de caché umbrales). Para activar el modo tradicional, establecer el ro.lmk.use_minfree_levels propiedad a true .

Configuración de lmkd

Configurar lmkd para un dispositivo específico utilizando las siguientes propiedades.

Propiedad Usar Defecto
ro.config.low_ram Especifique si el dispositivo tiene poca RAM o un dispositivo de alto rendimiento. false
ro.lmk.use_psi Use monitores psi (en lugar de vmpressure eventos). true
ro.lmk.use_minfree_levels Utilice los umbrales de memoria libre y caché de archivos para tomar decisiones de eliminación de procesos (es decir, igualar la funcionalidad del controlador LMK en el kernel). false
ro.lmk.low El mínimo oom_adj puntuación para procesos elegibles para matar a baja vmpressure nivel. 1001
(discapacitado)
ro.lmk.medium El mínimo oom_adj puntuación para procesos elegibles para ser muerto en medio vmpressure nivel. 800
(servicios en caché o no esenciales)
ro.lmk.critical El mínimo oom_adj puntuación para procesos elegibles para ser matado al crítico vmpressure nivel. 0
(cualquier proceso)
ro.lmk.critical_upgrade Habilite la actualización al nivel crítico. false
ro.lmk.upgrade_pressure El máximo mem_pressure a la que se actualiza el nivel porque el sistema está intercambiando demasiado. 100
(discapacitado)
ro.lmk.downgrade_pressure El mínimo mem_pressure a la que un vmpressure caso se ignora porque hay suficiente memoria libre que está disponible. 100
(discapacitado)
ro.lmk.kill_heaviest_task Elimina la tarea elegible más pesada (mejor decisión) frente a cualquier tarea elegible (decisión rápida). true
ro.lmk.kill_timeout_ms Duración en milisegundos después de una muerte cuando no se realizará ninguna muerte adicional. 0
(discapacitado)
ro.lmk.debug Habilitar lmkd registros de depuración. false

Ejemplo de configuración de 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

Espacio de usuario lmkd en Android 11

Android 11 mejora la lmkd mediante la introducción de una nueva estrategia de matar. La estrategia de matar utiliza un mecanismo de PSI para la detección de la presión de memoria introducida en Android 10. lmkd en Android 11 cuentas para los niveles de uso de los recursos de memoria y thrashing para evitar la inanición de memoria y degradación del rendimiento. Esta estrategia de eliminación reemplaza las estrategias anteriores y se puede utilizar tanto en dispositivos de alto rendimiento como de baja RAM (Android Go).

Requisitos del kernel

Durante 11 dispositivos Android, lmkd requiere la siguiente configuración del kernel:

  • Incluya parches de PSI y habilite PSI (versiones posteriores disponibles en los kernels comunes de Android 4.9, 4.14 y 4.19).
  • Incluya parches de compatibilidad con PIDFD (versiones posteriores disponibles en los kernels comunes de Android 4.9, 4.14 y 4.19).
  • Para dispositivos con poca RAM, incluya grupos de memoria.

El kernel debe compilarse con las siguientes opciones de configuración:

CONFIG_PSI=y

Configuración de lmkd en Android 11

La estrategia de eliminación de memoria en Android 11 admite las perillas de ajuste y los valores predeterminados que se enumeran a continuación. Estas características funcionan tanto en dispositivos de alto rendimiento como en dispositivos con poca RAM.

Propiedad Usar Defecto
Alto rendimiento RAM baja
ro.lmk.psi_partial_stall_ms El umbral de bloqueo de PSI parcial, en milisegundos, para activar la notificación de memoria baja. Si el dispositivo recibe notificaciones de presión de memoria demasiado tarde, disminuya este valor para activar notificaciones anteriores. Si las notificaciones de presión de memoria se activan innecesariamente, aumente este valor para que el dispositivo sea menos sensible al ruido. 70 200
ro.lmk.psi_complete_stall_ms El umbral de bloqueo de PSI completo, en milisegundos, para activar notificaciones de memoria críticas. Si el dispositivo recibe notificaciones de presión de memoria crítica demasiado tarde, disminuya este valor para activar notificaciones anteriores. Si las notificaciones de presión de memoria crítica se activan innecesariamente, aumente este valor para que el dispositivo sea menos sensible al ruido. 700
ro.lmk.thrashing_limit La cantidad máxima de reajustes del conjunto de trabajo como porcentaje del tamaño total de la caché de página respaldada por archivos. Los valores predeterminados del conjunto de trabajo por encima de este valor significan que se considera que el sistema está destruyendo su caché de página. Si el rendimiento del dispositivo se ve afectado durante la presión de la memoria, disminuya el valor para limitar la paliza. Si el rendimiento del dispositivo se elimina innecesariamente por motivos de golpes, aumente el valor para permitir más golpes. 100 30
ro.lmk.thrashing_limit_decay La caída del umbral de paliza expresada como un porcentaje del umbral original utilizado para reducir el umbral cuando el sistema no se recupera, incluso después de una muerte. Si la paliza continua produce muertes innecesarias, disminuya el valor. Si la respuesta a la paliza continua después de una muerte es demasiado lenta, aumente el valor. 10 50
ro.lmk.swap_util_max La cantidad máxima de memoria intercambiada como porcentaje de la memoria intercambiable total. Cuando la memoria intercambiada supera este límite, significa que el sistema intercambió la mayor parte de su memoria intercambiable y todavía está bajo presión. Esto puede suceder cuando las asignaciones no intercambiables generan una presión de memoria que no se puede aliviar mediante el intercambio porque la mayor parte de la memoria intercambiable ya está intercambiada. El valor predeterminado es 100, lo que deshabilita efectivamente esta verificación. Si el rendimiento del dispositivo se ve afectado durante la presión de memoria mientras que la utilización de intercambio es alta y el nivel de intercambio libre no está cayendo a ro.lmk.swap_free_low_percentage , disminuir el valor de la utilización de intercambio límite. 100 100

Las siguientes perillas de sintonización antiguas también funcionan con la nueva estrategia de eliminación.

Propiedad Usar Defecto
Alto rendimiento RAM baja
ro.lmk.swap_free_low_percentage El nivel de intercambio gratuito como porcentaje del espacio total de intercambio. `lmkd` usa este valor como un umbral para cuando considerar el sistema como espacio de intercambio hambriento. Si `lmkd` mata mientras hay demasiado espacio en el intercambio, disminuya el porcentaje. Si las muertes de `lmkd` ocurren demasiado tarde, lo que permite que ocurran muertes de OOM, aumente el porcentaje. 20 10
ro.lmk.debug Esto habilita los registros de depuración de `lmkd`. Habilite la depuración mientras ajusta. false