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.
The AutoFDO profile (kernel.afdo) for vmlinux is collected on kernel version 6.6.123 ( SHA 276ca917d82bbadd5904c10e4073f9955cd8893d, build server ID 14925724) using Pixel 10.
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.
| Benchmark | Improvement |
|---|---|
| Boot time | 1.5% |
| Cold App launch time | 3.0% |
| Binder-rpc | 19.5% |
| Binder-addints | 37.7% |
| Hwbinder | 11.7% |
Other improvements tested on past profiles:
| Benchmark | Improvement |
|---|---|
| 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.
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.
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