Novedades de productos

Mejora el rendimiento de Android: Presentamos AutoFDO para el kernel

Lectura de 4 min
Ver el perfil de Charles Munger
Yabin Cui Ingeniero de software

Somos el equipo de la cadena de herramientas de LLVM de Android. Una de nuestras principales prioridades es mejorar el rendimiento de Android a través de técnicas de optimización en el ecosistema de LLVM. Buscamos constantemente formas de hacer que Android sea más rápido, fluido y eficiente. Si bien gran parte de nuestro trabajo de optimización se realiza en el espacio de usuario, el kernel sigue siendo el corazón del sistema. Hoy, nos complace compartir cómo incorporamos la optimización automática dirigida por comentarios (AutoFDO) al kernel de Android para brindar mejoras de rendimiento significativas a los usuarios.

¿Qué es AutoFDO?

Durante una compilación de software estándar, el compilador toma miles de decisiones pequeñas, como si se debe intercalar una función y qué rama de un condicional es probable que se tome, según las sugerencias de código estático.Si bien estas heurísticas son útiles, no siempre predicen con precisión la ejecución del código durante el uso real del teléfono.

AutoFDO cambia esto usando patrones de ejecución reales para guiar al compilador. Estos patrones representan las rutas de ejecución de instrucciones más comunes que toma el código durante el uso real, que se capturan registrando el historial de ramificación de la CPU. Si bien estos datos se pueden recopilar de los dispositivos de la flota, para el kernel, los sintetizamos en un entorno de lab con cargas de trabajo representativas, como la ejecución de las 100 apps más populares. Usamos un generador de perfiles de muestreo para capturar estos datos, lo que nos permite identificar qué partes del código son "activas" (se usan con frecuencia) y cuáles son "inactivas". Cuando volvemos a compilar el kernel con estos perfiles, el compilador puede tomar decisiones de optimización mucho más inteligentes adaptadas a las cargas de trabajo reales de Android.

Para comprender el impacto de esta optimización, ten en cuenta estos datos clave:

  • En Android, el kernel representa alrededor del 40% del tiempo de CPU.
  • Ya usamos AutoFDO para optimizar los ejecutables y las bibliotecas nativos en el espacio del usuario, lo que permite mejorar en un 4% el inicio de apps en frío y reducir en un 1% el tiempo de inicio.

Mejoras de rendimiento en el mundo real

Observamos mejoras impresionantes en las métricas clave de Android gracias al uso de perfiles de entornos de lab controlados. Estos perfiles se recopilaron con el rastreo y el inicio de apps, y se midieron en dispositivos Pixel en los kernels 6.1, 6.6 y 6.12.

A continuación, se indican las mejoras más notables. Puedes encontrar detalles sobre los perfiles de AutoFDO para estas versiones de kernel en los repositorios de kernel de Android correspondientes para los kernels android16-6.12 y android15-6.6.

boosting_2.png

No se trata solo de números teóricos. Se traducen en una interfaz más ágil, un cambio de app más rápido, una mayor duración de batería y un dispositivo con mayor capacidad de respuesta para el usuario final.

Cómo funciona: La canalización

Nuestra estrategia de implementación incluye una canalización sofisticada para garantizar que los perfiles sigan siendo relevantes y que el rendimiento se mantenga estable.

boosting_3.png

Paso 1: Recopilación de perfiles

Si bien confiamos en nuestra flota de pruebas interna para generar perfiles de objetos binarios del espacio de usuario, cambiamos a un entorno de lab controlado para la imagen genérica del kernel (GKI). Desvincular la generación de perfiles del ciclo de lanzamiento del dispositivo permite realizar actualizaciones flexibles e inmediatas, independientemente de las versiones de kernel implementadas. Fundamentalmente, las pruebas confirman que estos datos basados en el laboratorio ofrecen mejoras de rendimiento comparables a las de las flotas del mundo real.

  • Herramientas y entorno: Actualizamos los dispositivos de prueba con la imagen de kernel más reciente y usamos simpleperf para capturar flujos de ejecución de instrucciones. Este proceso se basa en las capacidades del hardware para registrar el historial de ramificaciones, específicamente con  ARM Embedded Trace Extension (ETE) y ARM Trace Buffer Extension (TRBE) en dispositivos Pixel.
  • Cargas de trabajo: Creamos una carga de trabajo representativa con las 100 apps más populares del Conjunto de pruebas de compatibilidad de apps para Android (C-Suite). Para capturar los datos más precisos, nos enfocamos en lo siguiente:
    • Inicio de la app: Optimiza para las demoras más visibles para el usuario.
    • Rastreo de apps impulsado por IA: Simula interacciones de usuarios contiguas y en evolución
    • Supervisión de todo el sistema: Captura no solo las actividades de las apps en primer plano, sino también las cargas de trabajo críticas en segundo plano y las comunicaciones entre procesos.
  • Validación: Esta carga de trabajo sintetizada muestra una similitud del 85% con los patrones de ejecución recopilados de nuestra flota interna.
  • Datos segmentados: Repitiendo estas pruebas lo suficiente, capturamos patrones de ejecución de alta fidelidad que representan con precisión la interacción de los usuarios en el mundo real con las aplicaciones más populares. Además, este framework extensible nos permite integrar sin problemas cargas de trabajo y comparativas adicionales para ampliar nuestra cobertura.

Paso 2: Procesamiento de perfiles

Procesamos posteriormente los datos de seguimiento sin procesar para asegurarnos de que estén limpios, sean eficaces y estén listos para el compilador.

  • Agregación: Consolidamos los datos de varias ejecuciones de pruebas y dispositivos en una sola vista del sistema.
  • Conversión:  Convertimos los seguimientos sin procesar en el formato de perfil de AutoFDO y filtramos los símbolos no deseados según sea necesario.
  • Recorte de perfiles: Recortamos los perfiles para quitar los datos de las funciones "en frío", lo que les permite usar la optimización estándar. Esto evita las regresiones en el código que se usa con poca frecuencia y los aumentos innecesarios en el tamaño del objeto binario.

Paso 3: Prueba de perfiles

Antes de la implementación, los perfiles se someten a una verificación rigurosa para garantizar que ofrezcan mejoras de rendimiento constantes sin riesgos de estabilidad.

  • Análisis de perfiles y objetos binarios: Comparamos estrictamente el contenido del perfil nuevo (incluidas las funciones activas, los recuentos de muestras y el tamaño del perfil) con las versiones anteriores. También usamos el perfil para compilar una nueva imagen de kernel, analizando los objetos binarios para garantizar que los cambios en la sección de texto sean coherentes con las expectativas.
  • Verificación del rendimiento: Ejecutamos comparativas específicas en la nueva imagen del kernel. Esto confirma que mantiene las mejoras de rendimiento establecidas por las comparativas anteriores.

Actualizaciones continuas

El código "se desvía" de forma natural con el tiempo, por lo que un perfil estático perdería su eficacia con el tiempo. Para mantener el máximo rendimiento, ejecutamos la canalización de forma continua para generar actualizaciones periódicas:

  • Actualización periódica: Actualizamos los perfiles en las ramas de LTS del kernel de Android antes de cada lanzamiento de GKI, lo que garantiza que cada compilación incluya los datos de perfil más recientes.
  • Expansión futura: Actualmente, estamos entregando estas actualizaciones a las ramas android16-6.12 y android15-6.6, y ampliaremos la compatibilidad con versiones más recientes de GKI, como la próxima android17-6.18.

Garantiza la estabilidad

Una pregunta común sobre la optimización guiada por perfiles es si presenta riesgos de estabilidad. Debido a que AutoFDO influye principalmente en la heurística del compilador, como la inserción de funciones y el diseño del código, en lugar de alterar la lógica del código fuente, conserva la integridad funcional del kernel. Esta tecnología ya se probó a gran escala y, durante años, sirvió como una optimización estándar para las bibliotecas de la plataforma de Android, ChromeOS y la infraestructura de servidores de Google.

Para garantizar aún más un comportamiento coherente, aplicamos una estrategia "conservadora de forma predeterminada". Las funciones que no se capturan en nuestros perfiles de alta fidelidad se optimizan con métodos de compilador estándar. Esto garantiza que las partes "frías" o que se ejecutan con poca frecuencia del kernel se comporten exactamente como lo harían en una compilación estándar, lo que evita regresiones de rendimiento o comportamientos inesperados en casos extremos.

Qué trae el futuro

Actualmente, estamos implementando AutoFDO en las ramas android16-6.12 y android15-6.6. Más allá de este lanzamiento inicial, vemos varias vías prometedoras para mejorar aún más la tecnología:

  • Alcance ampliado: Esperamos implementar perfiles de AutoFDO en versiones más recientes del kernel de GKI y objetivos de compilación adicionales más allá de la compatibilidad actual con aarch64.
  • Optimización de módulos de GKI: Actualmente, nuestra optimización se centra en el objeto binario principal del kernel (vmlinux). Expandir AutoFDO a los módulos de GKI podría aportar beneficios de rendimiento a una parte más grande del subsistema del kernel.
  • Compatibilidad con módulos de proveedores: También nos interesa admitir AutoFDO para módulos de proveedores compilados con el Kit de desarrollo de controladores (DDK). Con la compatibilidad ya disponible en nuestro sistema de compilación (Kleaf) y las herramientas de generación de perfiles (simpleperf), los proveedores pueden aplicar estas mismas técnicas de optimización a sus controladores de hardware específicos.
  • Cobertura de perfiles más amplia: Existe la posibilidad de recopilar perfiles de una gama más amplia de recorridos críticos del usuario (CUJ) para optimizarlos.

Con la incorporación de AutoFDO al kernel de Android, nos aseguramos de que la base del SO esté optimizada para la forma en que usas tu dispositivo todos los días.

Escrito por:
Continuar leyendo