tree: 30af2a779231b9354f20c635b263ed8c60eb1bbe [path history] [tgz]
  1. kernel.afdo
  2. README.md
android/gki/aarch64/afdo/README.md

AutoFDO profiles for Android common kernels

This directory contains AutoFDO profiles for Android common kernels. These profiles are used to optimize kernel builds, improving performance for specific architectures and kernel versions.

kernel.afdo

The AutoFDO profile (kernel.afdo) for vmlinux is collected on kernel version 6.6.123 ( SHA 276ca917d82bbadd5904c10e4073f9955cd8893d, build server ID 14925724) using Pixel 10.

Performance improvements

The metrics below reflect the latest benchmark evaluations gathered using the 6.6.123 profile on Pixel 8. While a successful profile is defined by positive improvements across most benchmarks, results may fluctuate between updates. These variances can be driven by kernel and userspace code changes, the sampled nature of AutoFDO profiles, testing hardware differences, and inherent benchmark noise.

BenchmarkImprovement
Boot time1.5%
Cold App launch time3.0%
Binder-rpc19.5%
Binder-addints37.7%
Hwbinder11.7%

Other improvements tested on past profiles:

BenchmarkImprovement
Bionic (syscall_mmap)3.8%
Bionic (pthread)1.9%
Bionic (stdio)5.4%
Bionic (all)2.9%

To test a kernel prebuilt with the AutoFDO profile, navigate to Android build server and download the kernel prebuilts under the kernel_aarch64_autofdo target.

Steps to reproduce the profile

A kernel profile is generated by running app crawling and app launching for top 100 apps from Google Play Store. While running, we collect ETM data for the kernel, which records executed instruction stream. Finally, we merge and convert ETM data to one AutoFDO profile.

1. Build a kernel image and flash it on an Android device

  • The source code and test device used to generate each profile are described above.
  • We use a Pixel device. But using other real devices should get a similar profile.

2. Run app crawling and app launching for top 100 apps

  • Add a gmail account on the test device. Because app crawler can use the account to automatically login some of the apps.
  • We run App Crawler for one app for 3 minutes, and run it twice.
  • We run app launching for one app for 3 seconds, and run it 15 times. After each running, the app is killed and cache is cleared. So we get profile for cold app startups.

3. Generate the AutoFDO profile

First, collect performance data using simpleperf with Coresight ETM or ARM ETE while running app crawling and app launching scenarios. Following is an example recording kernel activity for 180 seconds. For a complete guide, refer to Record ETM data for the kernel.

(device) / $ simpleperf record -e cs-etm:k -a --duration 180 -z -o perf.data

Next, convert the ETM data to an AutoFDO profile using simpleperf inject and create_llvm_prof on the host machine. For a complete guide, refer to Convert ETM data to AutoFDO Profile on Host.

Note that create_llvm_prof recently enabled the symbol list by default, which can cause Clang to de-optimize any kernel function not listed in the profile. This is usually not we want in the kernel, unless the profile cover all critical paths. So we recommend adding --prof_sym_list=false to avoid de-optimization. This also prevents the following build error from section mismatch.

WARNING: modpost: vmlinux: section mismatch in reference: list_add+0x0 (section: .text.hot.list_add) -> dir_list (section: .init.data)

We use the following command to perform the conversion.

# Convert the AutoFDO profile to the LLVM profile format:
# The --prof_sym_list=false flag is important for kernel profiles. Without it, clang
# assumes any function not listed in the profile is cold. This can lead to unwanted
# deoptimizations, even when -fprofile-sample-accurate is not enabled.
(host) $ create_llvm_prof --profiler=text --binary={vmlinux_dir}/vmlinux \
         --profile=kernel.autofdo --format=extbinary --use_fs_discriminator \
         --out=kernel.afdo --prof_sym_list=false