Novedades de productos

Mejora del rendimiento de Android: Presentamos AutoFDO para el kernel

Lectura de 4 min
Yabin Cui
Ingeniero de software

Somos el equipo de la cadena de herramientas de LLVM para 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 ofrecerles a los usuarios mejoras significativas en el rendimiento.

¿Qué es AutoFDO?

Durante una compilación de software estándar, el compilador toma miles de decisiones pequeñas, como si se debe insertar una función y qué rama de una 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 del teléfono en el mundo real.

AutoFDO cambia esto mediante el uso de patrones de ejecución del mundo real 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, capturadas mediante el registro del historial de ramificación de la CPU. Si bien estos datos se pueden recopilar de dispositivos de la flota, para el kernel, los sintetizamos en un entorno de laboratorio con cargas de trabajo representativas, como ejecutar las 100 apps más populares. Usamos un generador de perfiles de muestreo para capturar estos datos, identificar qué partes del código están "activas" (se usan con frecuencia) y cuáles están "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, considera estos datos clave:

  • En Android, el kernel representa aproximadamente el 40% del tiempo de CPU.
  • Ya usamos AutoFDO para optimizar los ejecutables y las bibliotecas nativas en el espacio de usuario, lo que permite lograr una mejora de aproximadamente el 4% en el inicio de apps inactivas y una reducción del 1% en el tiempo de arranque.

Mejoras de rendimiento en el mundo real

Observamos mejoras impresionantes en las métricas clave de Android aprovechando los perfiles de entornos de laboratorio controlados. Estos perfiles se recopilaron mediante 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 enumeran las mejoras más notables. Puedes encontrar detalles sobre los perfiles de AutoFDO para estas versiones del kernel en los repositorios respectivos del kernel de Android para los kernels android16-6.12 y android15-6.6.

boosting_2.png

Estos no son solo números teóricos. Se traducen en una interfaz más rápida, un cambio de app más rápido, una mayor duración de la batería y un dispositivo más responsivo en general 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 dependemos de nuestra flota de pruebas internas para generar perfiles de los objetos binarios del espacio de usuario, cambiamos a un entorno de laboratorio controlado para la imagen genérica del kernel (GKI). La separación de la generación de perfiles del ciclo de lanzamiento del dispositivo permite actualizaciones flexibles e inmediatas, independientemente de las versiones del kernel implementadas. Es fundamental que las pruebas confirmen que estos datos basados en el laboratorio ofrecen mejoras de rendimiento comparables a las de las flotas del mundo real.

  • Herramientas y entorno: Flasheamos dispositivos de prueba con la imagen del kernel más reciente y usamos simpleperf para capturar flujos de ejecución de instrucciones. Este proceso se basa en las capacidades de hardware para registrar el historial de ramificación, en particular, el uso de  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 de Android (C-Suite). Para capturar los datos más precisos, nos enfocamos en lo siguiente:
    • Inicio de apps: Optimización para las demoras de usuario más visibles
    • **Rastreo de apps impulsado por IA**: Simulación de interacciones de usuario contiguas y en evolución
    • Supervisión en todo el sistema: Captura no solo las actividades de la app 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: Si repetimos estas pruebas lo suficiente, capturamos patrones de ejecución de alta fidelidad que representan con precisión la interacción del usuario 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 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 datos de varias ejecuciones de prueba y dispositivos en una sola vista del sistema.
  • Conversión: Convertimos los seguimientos sin procesar al 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 "inactivas", 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 evita aumentos innecesarios en el tamaño binario.

Paso 3: Pruebas de perfiles

Antes de la implementación, los perfiles se someten a una verificación rigurosa para garantizar que ofrezcan mejoras de rendimiento coherentes 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 del kernel y analizar los objetos binarios para asegurarnos de que los cambios en la sección de texto sean coherentes con las expectativas.
  • Verificación del rendimiento: Ejecutamos comparativas segmentadas en la nueva imagen del kernel. Esto confirma que mantiene las mejoras de rendimiento establecidas por las líneas de base anteriores.

Actualizaciones continuas

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

  • Actualización periódica: Actualizamos los perfiles en las ramas 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, entregamos 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 con la optimización guiada por perfil es si introduce riesgos de estabilidad. Debido a que AutoFDO influye principalmente en las heurísticas 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 se usó como una optimización estándar para las bibliotecas de la plataforma de Android, ChromeOS y la propia infraestructura de servidores de Google durante años.

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 "inactivas" 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 del kernel principal (vmlinux). La expansión de AutoFDO a los módulos de GKI podría aportar beneficios de rendimiento a una mayor parte del subsistema del kernel.
  • Compatibilidad con módulos del proveedor: También nos interesa admitir AutoFDO para los módulos del proveedor 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), esto permite a los proveedores aplicar estas mismas técnicas de optimización a sus controladores de hardware específicos.
  • Mayor cobertura de perfiles: Existe la posibilidad de recopilar perfiles de una gama más amplia de recorridos críticos del usuario (CUJ) para optimizarlos.

Al incorporar 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:

Seguir leyendo