O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.
Esta página foi traduzida pela API Cloud Translation.
Switch to English

Daemon assassino com pouca memória

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

Sobre pressão de memória

Um sistema Android executando vários processos em paralelo pode encontrar situações em que a memória do sistema se esgota e processos que exigem mais experiência de memória atrasos perceptíveis. A pressão de memória , um estado em que o sistema está com pouca memória, requer que o Android libere memória (para aliviar a pressão), estrangulando ou eliminando processos sem importância, solicitando processos para liberar recursos em cache não críticos e assim por diante.

Historicamente, o Android monitorava a pressão da memória do sistema usando um driver LMK (low memory killer) no kernel, um mecanismo rígido que depende de valores embutidos em código. A partir do kernel 4.12, o driver LMK foi removido do kernel upstream e o lmkd do espaço do usuário executa tarefas de monitoramento de memória e lmkd processos.

Informação de perda de pressão

O Android 10 e lmkd posteriores são compatíveis com um novo modo lmkd que usa monitores de informações de perda de pressão do kernel (PSI) para detecção de pressão de memória. O patchset PSI no kernel upstream (backported para os kernels 4.9 e 4.14) mede a quantidade de tempo que as tarefas são atrasadas como resultado da falta 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. O kernel upstream também inclui monitores PSI que permitem que processos de espaço de usuário com privilégios (como lmkd ) especifiquem limites para esses atrasos e se inscrevam em eventos do kernel quando um limite é violado.

Monitores PSI versus sinais vmpressure

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

Usando monitores PSI

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

Desvantagens do driver LMK no kernel

O Android suspende o uso do driver LMK devido a uma série de problemas, incluindo:

  • Dispositivos com pouca RAM precisavam ser ajustados agressivamente e, mesmo assim, funcionariam mal em cargas de trabalho com grande pagecache ativo com backup de arquivo. O mau desempenho resultou em golpes e nenhuma morte.
  • O driver do kernel LMK dependia de limites de memória livre, sem escalonamento baseado na pressão da memória.
  • Devido à rigidez do design, os parceiros costumam personalizar o driver para que funcione em seus dispositivos.
  • O driver LMK se conectou à API do redutor de placa, que não foi projetada para operações pesadas, como procurar alvos e eliminá-los, o que vmscan processo de vmscan .

Espaço de usuário lmkd

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

Usando o espaço de usuário lmkd no Android 10

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

CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y

Estratégias de matar

O lmkd espaço de lmkd oferece suporte a estratégias de vmpressure baseadas em eventos vmpressure ou monitores PSI, sua gravidade e outras dicas, como a utilização de troca. As estratégias de eliminação diferem entre dispositivos de baixa memória e de alto desempenho:

  • Em dispositivos com pouca memória, o sistema deve tolerar pressão de memória mais alta como modo normal de operação.
  • Em dispositivos de alto desempenho, a pressão da memória deve ser vista como uma situação anormal e corrigida antes de afetar o desempenho geral.

Você pode configurar a estratégia de ro.config.low_ram usando a propriedade ro.config.low_ram (para obter detalhes, consulte Configuração de RAM baixa ).

O espaço de lmkd também suporta um modo legado no qual ele toma decisões de lmkd usando as mesmas estratégias do driver LMK interno (ou seja, memória livre e limites de cache de arquivo). Para habilitar o modo legado, defina a propriedade ro.lmk.use_minfree_levels como true .

Configurando lmkd

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

Propriedade Usar Padrão
ro.config.low_ram Especifique se o dispositivo é um dispositivo de baixa RAM ou alto desempenho. false
ro.lmk.use_psi Use monitores PSI (em vez de eventos vmpressure ). true
ro.lmk.use_minfree_levels Use a memória livre e os limites do cache de arquivo para tomar decisões de eliminação de processos (ou seja, corresponder à funcionalidade do driver LMK no kernel). false
ro.lmk.low A pontuação mínima de oom_adj para processos elegíveis para serem vmpressure em baixo nível de vmpressure . 1001
(Desativado)
ro.lmk.medium A pontuação mínima de oom_adj para processos elegíveis para serem vmpressure nível de vmpressure média vmpressure . 800
(serviços em cache ou não essenciais)
ro.lmk.critical A pontuação mínima de oom_adj para processos elegíveis para serem vmpressure nível crítico de vmpressure . 0
(qualquer processo)
ro.lmk.critical_upgrade Ative a atualização para o nível crítico. false
ro.lmk.upgrade_pressure O mem_pressure máximo no qual o nível é atualizado porque o sistema está trocando muito. 100
(Desativado)
ro.lmk.downgrade_pressure O mem_pressure mínimo no qual um evento vmpressure é ignorado porque ainda há memória livre suficiente disponível. 100
(Desativado)
ro.lmk.kill_heaviest_task Mate a tarefa elegível mais pesada (melhor decisão) versus qualquer tarefa elegível (decisão rápida). true
ro.lmk.kill_timeout_ms Duração em milissegundos após uma eliminação, quando nenhuma eliminação adicional será realizada. 0
(Desativado)
ro.lmk.debug Ative os logs de depuração do lmkd . false

Exemplo de configuração 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

Espaço de usuário lmkd no Android 11

O Android 11 melhora o lmkd introduzindo uma nova estratégia de lmkd . A estratégia de lmkd usa um mecanismo PSI para detecção de pressão de memória introduzido no Android 10. O lmkd no Android 11 considera os níveis de uso de recursos de memória e o thrashing para evitar a falta de memória e degradação do desempenho. Essa estratégia de eliminação substitui as estratégias anteriores e pode ser usada em dispositivos de alto desempenho e de baixa RAM (Android Go).

Requisitos de kernel

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

  • Inclua patches PSI e habilite PSI (backports disponíveis nos kernels comuns do Android 4.9, 4.14 e 4.19).
  • Inclui patches de suporte PIDFD (backports disponíveis nos kernels comuns do Android 4.9, 4.14 e 4.19).
  • Para dispositivos com pouca RAM, inclua grupos de memória.

O kernel deve ser compilado com as seguintes configurações:

CONFIG_PSI=y

Configurando lmkd no Android 11

A estratégia de matar a memória no Android 11 oferece suporte aos botões de ajuste e padrões listados abaixo. Esses recursos funcionam em dispositivos de alto desempenho e de baixa memória RAM.

Propriedade Usar Padrão
Alta performance RAM baixa
ro.lmk.psi_partial_stall_ms O limite parcial de paralisação PSI, em milissegundos, para acionar a notificação de pouca memória. Se o dispositivo receber notificações de pressão de memória muito tarde, diminua este valor para acionar notificações anteriores. Se as notificações de pressão de memória forem acionadas desnecessariamente, aumente esse valor para tornar o dispositivo menos sensível a ruídos. 70 200
ro.lmk.psi_complete_stall_ms O limite de paralisação PSI completo, em milissegundos, para acionar notificações de memória crítica. Se o dispositivo receber notificações críticas de pressão de memória tarde demais, diminua este valor para acionar notificações anteriores. Se notificações críticas de pressão de memória forem acionadas desnecessariamente, aumente esse valor para tornar o dispositivo menos sensível a ruídos. 700
ro.lmk.thrashing_limit A quantidade máxima de ajustes de workingset como uma porcentagem do tamanho total do pagecache suportado por arquivo. Os padrões do workingset acima desse valor significam que o sistema está bloqueando seu pagecache. Se o desempenho do dispositivo for afetado durante a pressão da memória, diminua o valor para limitar o thrashing. Se o desempenho do dispositivo for interrompido desnecessariamente por motivos de thrashing, aumente o valor para permitir mais thrashing. 100 30
ro.lmk.thrashing_limit_decay A queda do limite de thrashing expressa como uma porcentagem do limite original usado para diminuir o limite quando o sistema não se recupera, mesmo após uma eliminação. Se o thrashing contínuo produzir mortes desnecessárias, diminua o valor. Se a resposta ao thrashing contínuo após uma eliminação for muito lenta, aumente o valor. 10 50
ro.lmk.swap_util_max A quantidade máxima de memória trocada como uma porcentagem da memória total trocável. Quando a memória trocada ultrapassa esse limite, significa que o sistema trocou a maior parte da memória trocável e ainda está sob pressão. Isso pode acontecer quando as alocações não trocáveis ​​estão gerando pressão de memória que não pode ser aliviada pela troca porque a maior parte da memória trocável já foi trocada. O valor padrão é 100, o que desabilita efetivamente esta verificação. Se o desempenho do dispositivo for afetado durante a pressão da 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 , diminua 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 matança.

Propriedade Usar Padrão
Alta performance RAM baixa
ro.lmk.swap_free_low_percentage O nível de troca livre como uma porcentagem do espaço de troca total. `lmkd` usa este valor como um limite para quando considerar o sistema como um espaço de troca sem espaço. Se `lmkd` matar enquanto há muito espaço na troca, diminua a porcentagem. Se as mortes `lmkd` acontecerem tarde demais, permitindo que as mortes OOM aconteçam, aumente a porcentagem. 20 10
ro.lmk.debug Isso ativa os logs de depuração `lmkd`. Habilite a depuração durante o ajuste. false