Daemon do Low memory killer

O processo low memória killer daemon do Android (lmkd) monitora a memória de um sistema Android em execução e reage à alta pressão de memória eliminando processos menos essenciais para manter o desempenho do sistema aceitável níveis

Sobre a pressão da memória

Um sistema Android que executa vários processos em paralelo pode encontrar situações em que a memória do sistema está esgotada e processos que exigem mais a memória apresentar atrasos perceptíveis. Pressão na memória, um estado em que O sistema está com pouca memória e exige que o Android libere memória (para aliviar o a pressão) limitando ou eliminando processos sem importância, solicitando processos para liberar recursos não críticos em cache e assim por diante.

Historicamente, o Android monitorou a pressão da memória do sistema usando um kernel baixo memória killer (LMK), um mecanismo rígido que depende de código valores. A partir do kernel 4.12, o driver LMK é removido do upstream O kernel e o espaço do usuário lmkd realizam o monitoramento de memória e a eliminação de processos tarefas.

Informações sobre compressão de pressão

O Android 10 e versões mais recentes oferecem suporte a um novo modo lmkd que usa monitores de informação de pressão do kernel (PSI, na sigla em inglês) para medir a pressão da memória detecção de ameaças. O patchset PSI no kernel upstream (backport para 4.9 e 4.14) kernels) mede a quantidade de tempo que as tarefas são atrasadas como resultado de e a escassez de memória. Como esses atrasos afetam diretamente a experiência do usuário, eles representam uma métrica conveniente para determinar a gravidade da pressão da memória. A O kernel upstream também inclui monitores PSI que permitem um espaço do usuário privilegiado processos (como lmkd) para especificar limites para esses atrasos e para assinam eventos do kernel quando um limite é violado;

Monitores PSI versus indicadores do VMware

Como os sinais vmpressure (gerados pelo kernel para memória de pressão e usados por lmkd) geralmente incluem vários falsos positivos, O lmkd precisa realizar a filtragem para determinar se a memória está sob pressão real. Isso resulta em ativações lmkd desnecessárias e no uso de os recursos computacionais. O uso do PSI monitora resultados em uma memória mais precisa detecção de pressão e minimiza a sobrecarga de filtragem.

Usar monitores PSI

Para usar monitores PSI em vez de eventos vmpressure, configure o propriedade ro.lmk.use_psi. O padrão é true, tornando o PSI monitora mecanismo padrão de detecção de pressão de memória para lmkd. Como o PSI monitora exigirem suporte ao kernel, ele deve incluir os patches de backport do PSI e ser compilado com suporte a PSI ativado (CONFIG_PSI=y).

Desvantagens do driver LMK no kernel

O Android descontinua o driver LMK devido a vários problemas, incluindo:

  • Dispositivos com pouca memória RAM precisavam ser ajustados de forma agressiva, e mesmo assim têm baixo desempenho em cargas de trabalho com grande cache de página ativo apoiado por arquivos. A o desempenho ruim resultou em sobrecarga e nenhuma eliminação.
  • O driver do kernel do LMK dependia de limites de memória livre, sem base em escalonamento sobre a pressão da memória.
  • Devido à rigidez do design, os parceiros muitas vezes personalizavam o driver para que funcionasse nos dispositivos deles.
  • O driver LMK foi conectado à API de redutor de placas, que não era projetados para operações pesadas, como busca de alvos e assassinato o que retardou o processo vmscan.

lmkd do espaço do usuário

O espaço do usuário lmkd implementa a mesma funcionalidade que o driver no kernel. mas usa mecanismos de kernel atuais para detectar e estimar a pressão da memória. Essas os mecanismos incluem o uso de eventos vmpressure gerados pelo kernel ou barramento de pressão monitores de informação (PSI) para receber notificações sobre níveis de pressão de memória, e usar atributos cgroup para limitar os recursos de memória alocados a cada processo com base na importância do processo.

Usar o lmkd do espaço do usuário no Android 10

No Android 9 e versões mais recentes, o espaço do usuário lmkd é ativado se um driver LMK no kernel não é detectado. Porque o espaço do usuário lmkd requer suporte de kernel para cgroups de memória, o kernel deve ser compilado com o seguintes configurações:

CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y

Estratégias de eliminação

O espaço do usuário lmkd oferece suporte a estratégias de destruição baseadas em eventos vmpressure ou PSI de configuração, a gravidade deles e outras dicas, como a utilização de troca. Matar estratégias diferentes são entre dispositivos com pouca memória e alto desempenho:

  • Em dispositivos com pouca memória, o sistema deve tolerar uma pressão maior sobre a memória modo normal de operação.
  • Em dispositivos de alto desempenho, a pressão da memória deve ser encarada como uma situação e corrigida antes que afete o desempenho geral.

É possível configurar a estratégia de eliminação usando a propriedade ro.config.low_ram. Para detalhes, consulte Memória baixa do Terraform.

O espaço do usuário lmkd também oferece suporte a um modo legado em que ele toma decisões de eliminação. usando as mesmas estratégias que o driver LMK no kernel (ou seja, sem custo financeiro limites de memória e cache de arquivos). Para ativar o modo legado, defina o a propriedade ro.lmk.use_minfree_levels como true.

Configurar lmkd

Configure o lmkd para um dispositivo específico usando as propriedades abaixo.

Propriedade Uso Padrão
ro.config.low_ram Especifique se o dispositivo tem pouca memória RAM ou alto desempenho. false
ro.lmk.use_psi Usar monitores PSI (em vez de eventos vmpressure). true
ro.lmk.use_minfree_levels Usar a memória livre e os limites de cache de arquivos para interromper o processo decisões (ou seja, corresponder à funcionalidade do kernel driver LMK). false
ro.lmk.low A pontuação mínima de oom_adj para os processos qualificados morto no nível baixo de vmpressure. 1001
(desativado)
ro.lmk.medium A pontuação mínima de oom_adj para os processos qualificados encerrado no nível vmpressure médio. 800
(serviços armazenados em cache ou não essenciais)
ro.lmk.critical A pontuação mínima de oom_adj para os processos qualificados morto no nível crítico vmpressure. 0
(qualquer processo)
ro.lmk.critical_upgrade Ativar upgrade para o nível crítico. false
ro.lmk.upgrade_pressure O valor máximo de mem_pressure em que o nível é atualizado porque o sistema está fazendo muitas trocas. 100
(desativado)
ro.lmk.downgrade_pressure O mem_pressure mínimo em que um vmpressure é ignorado porque ainda há memória livre disponível. 100
(desativado)
ro.lmk.kill_heaviest_task Eliminar a tarefa qualificada mais pesada (melhor decisão) em relação a qualquer tarefa qualificada (decisão rápida). true
ro.lmk.kill_timeout_ms Duração em milissegundos após uma interrupção quando nenhuma interrupção adicional será feito. 0
(desativado)
ro.lmk.debug Ative os registros de depuração lmkd. false

Exemplo de configuração do 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 do espaço do usuário no Android 11

O Android 11 melhora a lmkd com a introdução de uma nova estratégia de destruição. A estratégia de eliminação usa um mecanismo PSI para a pressão da memória detectado no Android 10. lmkd pol. O Android 11 considera os níveis de uso de recursos de memória e sobrecarga para evitar a privação de memória e a degradação do desempenho. Essa estratégia de eliminação substitui as anteriores e pode ser usada dispositivos com alto desempenho e pouca memória RAM (Android Go).

Requisitos do kernel

Para dispositivos Android 11, o lmkd requer os seguintes recursos do kernel:

  • Incluir patches PSI e ativar PSI (backports disponíveis no Kernels comuns do Android 4.9, 4.14 e 4.19).
  • Incluir patches de suporte a PIDFD (backports disponíveis na versão comum do Android) kernels 4.9, 4.14 e 4.19).
  • Para dispositivos com pouca memória RAM, inclua cgroups de memória.

É necessário que o kernel seja compilado com as seguintes configurações:

CONFIG_PSI=y

Configurar o lmkd no Android 11

A estratégia de eliminação de memória no Android 11 oferece suporte os botões de ajuste e os padrões listados abaixo. Esses recursos funcionam com alto desempenho e pouca memória RAM.

Propriedade Uso Padrão
Alto desempenho Pouca RAM
ro.lmk.psi_partial_stall_ms O limite parcial de interrupção de PSI, em milissegundos, para acionar notificação de memória. Se o dispositivo receber notificações de pressão de memória tarde demais. Diminua esse valor para acionar notificações mais cedo. Se a memória de pressão são acionadas desnecessariamente. Aumente esse valor o dispositivo menos sensível ao ruído. 70 200
ro.lmk.psi_complete_stall_ms O limite completo de interrupção do PSI, em milissegundos, para acionamento notificações de memória crítica. Se o dispositivo receber memória crítica notificações de pressão muito tarde, diminua esse valor para ser acionado mais cedo notificações. Se as notificações de pressão de memória crítica forem acionadas desnecessariamente, aumente esse valor para tornar o dispositivo menos sensível barulho 700
ro.lmk.thrashing_limit A quantidade máxima de falhas do conjunto de trabalho como uma porcentagem do total tamanho do cache de página com suporte de arquivo. A média das falhas do conjunto de trabalho acima desse valor que o sistema está com sobrecarga do cache de página. Se o o desempenho do dispositivo é afetado durante a pressão sobre a memória, o valor para limitar a sobrecarga. Se o desempenho do dispositivo for encerrado desnecessariamente por motivos de sobrecarga, aumente o valor para permitir tropeçando. 100 30
ro.lmk.thrashing_limit_decay O decaimento do limite de sobrecarga expresso como uma porcentagem do o limite original é usado para diminuir o limite quando o sistema se recuperar, mesmo depois de uma morte. Se a sobrecarga contínua não for necessária encerra, diminui o valor. Se a resposta à sobrecarga contínua após um encerramento muito lento, aumente o valor. 10 50
ro.lmk.swap_util_max A quantidade máxima de memória trocada como uma porcentagem do total alternável memória. Quando a memória trocada ultrapassar esse limite, isso significa que sistema trocou a maior parte da memória alternável e ainda está sob pressão. Isso pode acontecer quando alocações não alternáveis estiverem gerando memória que não pode ser aliviada com a troca porque a maioria das partes a memória já foi trocada. O valor padrão é 100, que efetivamente desativa essa verificação. Se o desempenho do dispositivo for afetado durante pressão de memória enquanto a utilização de troca é alta e o nível de troca livre não está caindo para ro.lmk.swap_free_low_percentage, diminuir o valor para limitar a utilização de troca. 100 100

Os botões de ajuste antigos a seguir também funcionam com a nova estratégia de eliminação.

Propriedade Uso Padrão
Alto desempenho Pouca RAM
ro.lmk.swap_free_low_percentage O nível de troca livre como porcentagem do espaço de troca total. "lmkd" usa esse valor como um limite para considerar o sistema como uma troca o espaço morreu de fome. Se `lmkd` eliminar enquanto houver muito espaço em swap, diminuir a porcentagem. Se as eliminações por "lmkd" acontecerem tarde demais, permitir o fim da vida útil que várias mortes aconteçam, aumente a porcentagem. 20 10
ro.lmk.debug Isso ativa os registros de depuração "lmkd". Ativar depuração durante o ajuste. false