Novedades sobre 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. Siempre buscamos 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 ofrecer mejoras significativas en el rendimiento a los usuarios.

¿Qué es AutoFDO?

Durante una compilación de software estándar, el compilador toma miles de decisiones pequeñas, como si debe insertar una función y qué rama de una condicional es probable que se tome, en función de 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 usando 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 bifurcaciones 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 laboratorio 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, que identifica qué partes del código son "activas" (de uso frecuente) y cuáles son "inactivas". Cuando recompilamos el kernel con estos perfiles, el compilador puede tomar decisiones de optimización mucho más inteligentes y 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 aproximadamente el 40% del tiempo de CPU.
  • Ya usamos AutoFDO para optimizar los ejecutables y las bibliotecas nativas en el espacio del usuario, lo que permite mejorar en un 4% el inicio en frío de las apps y reducir en un 1% el tiempo de inicio.

Logros de rendimiento en el mundo real

Observamos mejoras impresionantes en las métricas clave de Android gracias al uso de perfiles de entornos de laboratorio controlados. Estos perfiles se recopilaron con el rastreo y el inicio de apps, y se midieron en dispositivos Pixel con 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.12android15-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 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). Desacoplar la generación de perfiles del ciclo de lanzamiento del dispositivo permite actualizaciones flexibles e inmediatas, independientemente de las versiones del kernel implementadas. Fundamentalmente, las pruebas confirman que estos datos basados en el laboratorio ofrecen mejoras en el rendimiento comparables a las de las flotas del mundo real.

  • Herramientas y entorno: Flasheamos los 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, y utiliza específicamente  la extensión de seguimiento integrado (ETE) de ARMla extensión de búfer de seguimiento (TRBE) de ARM 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:
    • Ejecución de la app: Optimización para las demoras más visibles del usuario
    • Rastreo de apps impulsado por IA: Simulación de interacciones del usuario contiguas y en evolución
    • Supervisión en 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 un 85% de similitud con los patrones de ejecución recopilados de nuestra flota interna.
  • Datos segmentados: Al repetir estas pruebas las veces suficientes, 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 del perfil

Procesamos los datos de registro sin procesar después de la recopilación para garantizar que estén limpios, sean eficaces y estén listos para el compilador.

  • Agregación: Consolidamos datos de varias ejecuciones de pruebas y dispositivos en una sola vista del sistema.
  • Conversión: Convertimos los registros 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 "frías", lo que les permite usar la optimización estándar. Esto evita regresiones en el código que se usa con poca frecuencia y evita aumentos innecesarios en el tamaño del código binario.

Paso 3: Prueba de perfil

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 perfil y binario: Comparamos estrictamente el contenido del nuevo perfil (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 analizamos los archivos binarios para garantizar 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 los valores de referencia 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 un rendimiento óptimo, 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, publicamos estas actualizaciones en las ramas android16-6.12 y android15-6.6, y ampliaremos la compatibilidad con versiones más recientes del GKI, como la próxima android17-6.18.

Garantizar la estabilidad

Una pregunta frecuente sobre la optimización guiada por perfil es si introduce riesgos de estabilidad. Dado 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, preserva la integridad funcional del kernel. Esta tecnología ya se probó a gran escala y, durante años, se usó 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.12android15-6.6. Más allá de este lanzamiento inicial, vemos varias vías prometedoras para mejorar aún más la tecnología:

  • Alcance expandido: Esperamos implementar perfiles de AutoFDO en versiones más recientes del kernel de GKI y en 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 archivo binario principal del kernel (vmlinux). Expandir AutoFDO a los módulos de GKI podría brindar beneficios de rendimiento a una mayor parte del subsistema del kernel.
  • Compatibilidad con módulos de proveedores: También nos interesa admitir AutoFDO para los módulos de proveedores creados con el Kit de desarrollo de controladores (DDK). Como ya contamos con compatibilidad en nuestro sistema de compilación (Kleaf) y 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.
  • Mayor cobertura del perfil: Existe la posibilidad de recopilar perfiles de una mayor variedad 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