Novidades sobre produtos

Melhoria na performance do Android: apresentação do AutoFDO para o kernel

Leitura de 4 minutos
Yabin Cui
Engenheiro de software

Somos a equipe do conjunto de ferramentas LLVM do Android. Uma das nossas principais prioridades é melhorar a performance do Android usando técnicas de otimização no ecossistema LLVM. Estamos sempre procurando maneiras de tornar o Android mais rápido, mais suave e mais eficiente. Embora grande parte do nosso trabalho de otimização aconteça no espaço do usuário, o kernel continua sendo o coração do sistema. Hoje, temos o prazer de compartilhar como estamos trazendo a otimização automática direcionada por feedback (AutoFDO) para o kernel do Android, oferecendo melhorias significativas de performance para os usuários.

O que é o AutoFDO?

Durante uma build de software padrão, o compilador toma milhares de pequenas decisões, como se deve incorporar uma função e qual ramificação de uma condicional é mais provável de ser tomada, com base em dicas de código estático.Embora essas heurísticas sejam úteis, elas nem sempre preveem com precisão a execução do código durante o uso real do smartphone.

O AutoFDO muda isso usando padrões de execução reais para orientar o compilador. Esses padrões representam os caminhos de execução de instruções mais comuns que o código segue durante o uso real, capturados pela gravação do histórico de ramificação da CPU. Embora esses dados possam ser coletados de dispositivos da frota, para o kernel, eles são sintetizados em um ambiente de laboratório usando cargas de trabalho representativas, como a execução dos 100 apps mais populares. Usamos um criador de perfil de amostragem para capturar esses dados, identificando quais partes do código são "quentes" (usadas com frequência) e quais são "frias".Quando reconstruímos o kernel com esses perfis, o compilador pode tomar decisões de otimização muito mais inteligentes, adaptadas às cargas de trabalho reais do Android.

Para entender o impacto dessa otimização, considere estes fatos importantes:

  • No Android, o kernel representa cerca de 40% do tempo da CPU.
  • Já estamos usando o AutoFDO para otimizar executáveis e bibliotecas nativas no espaço do usuário, alcançando cerca de 4% de melhoria no lançamento de apps frios e uma redução de 1% no tempo de inicialização.

Melhorias de performance no mundo real

Observamos melhorias impressionantes nas principais métricas do Android ao aproveitar perfis de ambientes de laboratório controlados. Esses perfis foram coletados usando a indexação e a inicialização de apps e medidos em dispositivos Pixel nos kernels 6.1, 6.6 e 6.12.

As melhorias mais notáveis estão listadas abaixo. Os detalhes sobre os perfis do AutoFDO para essas versões do kernel podem ser encontrados nos respectivos repositórios do kernel do Android para os kernels android16-6.12 e android15-6.6.

boosting_2.png

Esses não são apenas números teóricos. Eles se traduzem em uma interface mais rápida, troca de apps mais rápida, maior duração da bateria e um dispositivo mais responsivo para o usuário final.

Como funciona: o pipeline

Nossa estratégia de implantação envolve um pipeline sofisticado para garantir que os perfis permaneçam relevantes e a performance permaneça estável.

boosting_3.png

Etapa 1: coleta de perfis

Embora dependamos da nossa frota de testes interna para criar perfis de binários do espaço do usuário, mudamos para um ambiente de laboratório controlado para a imagem genérica do kernel (GKI, na sigla em inglês). A separação da criação de perfis do ciclo de lançamento do dispositivo permite atualizações flexíveis e imediatas, independentemente das versões do kernel implantadas. É fundamental que os testes confirmem que esses dados baseados em laboratório oferecem ganhos de performance comparáveis aos de frotas reais.

Etapa 2: processamento de perfis

Pós-processamos os dados de rastreamento brutos para garantir que eles sejam limpos, eficazes e prontos para o compilador.

  • Agregação:consolidamos dados de várias execuções de teste e dispositivos em uma única visualização do sistema.
  • Conversão: Nós convertemos rastreamentos brutos para o formato de perfil do AutoFDO, filtrando símbolos indesejados conforme necessário.
  • Corte de perfil:cortamos perfis para remover dados de funções "frias", permitindo que eles usem a otimização padrão. Isso evita regressões em códigos raramente usados e evita aumentos desnecessários no tamanho binário.

Etapa 3: teste de perfil

Antes da implantação, os perfis passam por uma verificação rigorosa para garantir que ofereçam ganhos de performance consistentes sem riscos de estabilidade.

  • Análise de perfil e binário:comparamos estritamente o conteúdo do novo perfil (incluindo funções ativas, contagens de amostras e tamanho do perfil) com versões anteriores. Também usamos o perfil para criar uma nova imagem do kernel, analisando binários para garantir que as mudanças na seção de texto sejam consistentes com as expectativas.
  • Verificação de performance:executamos benchmarks direcionados na nova imagem do kernel. Isso confirma que ela mantém as melhorias de performance estabelecidas por linhas de base anteriores.

Atualizações contínuas

O código naturalmente "desvia" com o tempo, então um perfil estático acabaria perdendo a eficácia. Para manter a performance máxima, executamos o pipeline continuamente para gerar atualizações regulares:

  • Atualização regular: atualizamos os perfis nas ramificações LTS do kernel do Android antes de cada lançamento do GKI, garantindo que cada build inclua os dados de perfil mais recentes.
  • Expansão futura:atualmente, estamos oferecendo essas atualizações para as ramificações android16-6.12 e android15-6.6 e vamos expandir o suporte para versões mais recentes do GKI, como a próxima android17-6.18.

Como garantir a estabilidade

Uma pergunta comum sobre a otimização guiada por perfil é se ela introduz riscos de estabilidade. Como o AutoFDO influencia principalmente as heurísticas do compilador, como a incorporação de funções e o layout do código, em vez de alterar a lógica do código-fonte, ele preserva a integridade funcional do kernel. Essa tecnologia já foi comprovada em escala, servindo como uma otimização padrão para bibliotecas de plataforma Android, ChromeOS e a própria infraestrutura de servidores do Google há anos.

Para garantir ainda mais o comportamento consistente, aplicamos uma estratégia "conservadora por padrão". As funções não capturadas nos nossos perfis de alta fidelidade são otimizadas usando métodos de compilador padrão. Isso garante que as partes "frias" ou raramente executadas do kernel se comportem exatamente como em uma build padrão, evitando regressões de performance ou comportamentos inesperados em casos extremos.

O que nos espera

Atualmente, estamos implantando o AutoFDO nas ramificações android16-6.12 e android15-6.6. Além desse lançamento inicial, vemos várias maneiras promissoras de aprimorar ainda mais a tecnologia:

  • Alcance expandido:esperamos implantar perfis do AutoFDO em versões mais recentes do kernel do GKI e em outros destinos de build além do suporte atual aarch64.
  • Otimização do módulo GKI:atualmente, nossa otimização está focada no binário principal do kernel (vmlinux). A expansão do AutoFDO para módulos GKI pode trazer benefícios de performance para uma parte maior do subsistema do kernel.
  • Suporte a módulos de fornecedores:também temos interesse em oferecer suporte ao AutoFDO para módulos de fornecedores criados usando o Kit de desenvolvimento de drivers (DDK, na sigla em inglês). Com o suporte já disponível no nosso sistema de build (Kleaf) e nas ferramentas de criação de perfil (simpleperf), isso permite que os fornecedores apliquem essas mesmas técnicas de otimização aos drivers de hardware específicos.
  • Cobertura de perfil mais ampla:há potencial para coletar perfis de uma variedade maior de jornadas ideais do usuário (CUJs, na sigla em inglês) para otimizá-los.

Ao trazer o AutoFDO para o kernel do Android, estamos garantindo que a base do SO seja otimizada para a maneira como você usa o dispositivo todos os dias.

Escrito por:

Continuar lendo