O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

Daemon do assassino com pouca memória

Os Android baixo memória assassino daemon ( lmkd ) monitores de processos do estado da memória de um sistema Android rodando e reage a pressão elevada memória, matando os processos menos essenciais para manter o sistema de desempenho 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. Pressão de memória, um estado no qual o sistema está com falta de memória, requer Android para libertar memória (para aliviar a pressão) por estrangulamento ou matar processos sem importância, solicitando processos para recursos em cache não críticos livres, e assim por diante.

Historicamente, o Android monitorava a pressão da memória do sistema usando um driver assassino de baixa memória (LMK) no kernel, um mecanismo rígido que depende de valores embutidos em código. A partir do kernel 4.12, o motorista LMK é removido do kernel principal eo userspace lmkd monitoramento de memória executa e tarefas matando processo.

Informação de perda de pressão

Android 10 e depois apoiar um novo lmkd modo que os usos do kernel informação tenda pressão (PSI) monitores 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 os processos do espaço do usuário privilegiado (como lmkd ) para especificar limites para estes atrasos e para inscrever-se a eventos do kernel quando um limite é violado.

Monitores PSI versus sinais de pressão vm

Porque os vmpressure sinais (gerados pelo kernel para detecção de pressão de memória e utilizados por lmkd ) incluem frequentemente numerosos falsos positivos, lmkd deve executar a filtragem para determinar se a memória está sob pressão real. Isso resulta em desnecessários lmkd wakeups eo 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 vmpressure eventos, configure o ro.lmk.use_psi propriedade. O padrão é true , tornando monitores PSI o mecanismo padrão de detecção de pressão para a memória lmkd . Como os monitores PSI requerem suporte de kernel, o núcleo tem de incluir os remendos Backport PSI e ser compilada com o suporte activado PSI ( 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 com base na pressão da memória.
  • Devido à rigidez do design, os parceiros costumam personalizar o driver para que funcione em seus dispositivos.
  • O motorista LMK enganchado na API laje shrinker, que não foi concebido para operações pesadas, tais como a procura de alvos e matá-los, que atrasaram a vmscan processo.

Espaço de usuário lmkd

O espaço do usuário lmkd implementa a mesma funcionalidade que o driver no kernel, mas usa mecanismos de kernel existentes para detectar e pressão de memória estimativa. Tais mecanismos incluem o uso gerado pelo núcleo vmpressure eventos ou informações tenda de pressão (PSI) monitores para receber notificações sobre os níveis de pressão de memória e uso de recursos cgroup 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

Em Android 9 e posterior, userspace lmkd ativa se um driver LMK no kernel não é detectado. Porque userspace lmkd requer suporte do kernel para cgroups de memória, o kernel deve ser compilado com as definições de configuração a seguir:

CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y

Estratégias de matar

Userspace lmkd suportes matar estratégias baseadas em vmpressure eventos ou monitores PSI, sua gravidade e outras dicas como a utilização swap. 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 que afete o desempenho geral.

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

Userspace lmkd também suporta um modo legado em que toma decisões matar usando as mesmas estratégias como o motorista LMK in-kernel (limiares ou seja, memória livre e cache de arquivos). Para ativar o modo legado, defina o ro.lmk.use_minfree_levels propriedade para true .

Configurando lmkd

Configurar lmkd para um dispositivo específico utilizando as seguintes propriedades.

Propriedade Usar Predefinição
ro.config.low_ram Especifique se o dispositivo é um dispositivo de baixa RAM ou de alto desempenho. false
ro.lmk.use_psi Use monitores psi (em vez de vmpressure eventos). 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 O mínimo oom_adj pontuação para processos elegíveis para ser morto em baixa vmpressure nível. 1001
(Desativado)
ro.lmk.medium O mínimo oom_adj pontuação para processos elegíveis para ser morto no meio vmpressure nível. 800
(serviços em cache ou não essenciais)
ro.lmk.critical O mínimo oom_adj pontuação para processos elegíveis para ser morto a crítica vmpressure nível. 0
(qualquer processo)
ro.lmk.critical_upgrade Ative a atualização para o nível crítico. false
ro.lmk.upgrade_pressure A máxima mem_pressure em que o nível é atualizado porque o sistema está trocando muito. 100
(Desativado)
ro.lmk.downgrade_pressure O mínimo mem_pressure em que um vmpressure evento é ignorado porque a memória livre suficiente ainda está 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 Ativar lmkd logs de depuração. 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

Android 11 melhora a lmkd através da introdução de uma nova estratégia de matar. A estratégia matando usa um mecanismo PSI para a detecção de pressão de memória introduzido no Android 10. lmkd no Android 11 contas para níveis de utilização de recursos de memória e se debatendo para evitar a fome 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 Android 11 dispositivos, lmkd requer os seguintes recursos do kernel:

  • Inclua patches PSI e habilite o 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 Predefiniçã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 memória insuficiente. 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 da 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 muito tarde, 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á sobrecarregando 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 redução 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 desativa efetivamente esta verificação. Se o desempenho do dispositivo é afetada durante a pressão de memória enquanto a utilização de swap é alta eo nível de swap livre não está caindo para ro.lmk.swap_free_low_percentage , diminua o valor para utilização limite de swap. 100 100

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

Propriedade Usar Predefiniçã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 houver 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