在 Linux 内核中使用 AutoFDO¶
这在使用 Clang 编译器时为内核启用 AutoFDO 构建支持。AutoFDO(自动反馈定向优化)是一种配置文件引导优化 (PGO),用于增强二进制可执行文件的性能。它使用硬件采样收集有关二进制文件中各种代码路径执行频率的信息。然后,此数据用于指导编译器的优化决策,从而产生更高效的二进制文件。AutoFDO 是一种强大的优化技术,数据表明它可以显着提高内核性能。它对于受前端停顿影响的工作负载尤其有益。
对于 AutoFDO 构建,与非 FDO 构建不同,用户必须提供配置文件。获取 AutoFDO 配置文件可以通过多种方式完成。AutoFDO 配置文件是通过使用“perf”工具转换硬件采样来创建的。至关重要的是,用于创建这些 perf 文件的工作负载具有代表性;它们必须表现出与要优化的工作负载相似的运行时特征。否则,将导致编译器为错误的目标进行优化。
AutoFDO 配置文件通常封装了程序的行为。如果性能关键代码与体系结构无关,则可以将配置文件跨平台应用以实现性能提升。例如,使用在 Intel 架构上生成的配置文件来构建 AMD 架构的内核也可以产生性能改进。
有两种获取代表性配置文件的方法:(1)使用生产环境采样实际工作负载。(2)使用有代表性的负载测试生成配置文件。在启用 AutoFDO 构建配置而不提供 AutoFDO 配置文件时,编译器仅修改内核中的 dwarf 信息,而不会影响运行时性能。建议使用使用相同 AutoFDO 配置构建的内核二进制文件来收集 perf 配置文件。虽然可以使用使用不同选项构建的内核,但可能会导致性能下降。
可以使用先前内核的 AutoFDO 构建来收集配置文件。AutoFDO 采用相对行号来匹配配置文件,为源代码更改提供了一些容差。此模式通常在生产环境中用于配置文件收集。
在基于负载测试的配置文件收集中,AutoFDO 收集过程包括以下步骤
初始构建:内核使用 AutoFDO 选项构建,但不包含配置文件。
分析:然后,使用代表性工作负载运行上述内核以收集执行频率数据。此数据通过 perf 使用硬件采样收集。AutoFDO 在支持高级 PMU 功能(如 Intel 机器上的 LBR)的平台上最有效。
AutoFDO 配置文件生成:Perf 输出文件通过离线工具转换为 AutoFDO 配置文件。
该支持需要 Clang 编译器 LLVM 17 或更高版本。
准备工作¶
使用以下配置内核
CONFIG_AUTOFDO_CLANG=y
自定义¶
默认的 CONFIG_AUTOFDO_CLANG 设置涵盖 AutoFDO 构建的内核空间对象。但是,可以通过向各自的内核 Makefile 中添加类似于以下行的行来为单个文件和目录启用或禁用 AutoFDO 构建
对于启用单个文件(例如 foo.o)
AUTOFDO_PROFILE_foo.o := y
对于启用一个目录中的所有文件
AUTOFDO_PROFILE := y
对于禁用一个文件
AUTOFDO_PROFILE_foo.o := n
对于禁用一个目录中的所有文件
AUTOFDO_PROFILE := n
工作流程¶
以下是 AutoFDO 内核的工作流程示例
在启用 LLVM 的主机上构建内核,例如,
$ make menuconfig LLVM=1
打开 AutoFDO 构建配置
CONFIG_AUTOFDO_CLANG=y
对于启用 LLVM 的配置,请使用以下命令
$ scripts/config -e AUTOFDO_CLANG
获取配置后,使用以下命令构建
$ make LLVM=1
将内核安装在测试机上。
运行负载测试。perf 中的“-c”选项指定采样事件周期。我们建议为此目的使用合适的素数,例如 500009。
对于 Intel 平台
$ perf record -e BR_INST_RETIRED.NEAR_TAKEN:k -a -N -b -c <count> -o <perf_file> -- <loadtest>
对于 AMD 平台
支持的系统有:带有 BRS 的 Zen3 或带有 amd_lbr_v2 的 Zen4。要检查,
对于 Zen3
$ cat proc/cpuinfo | grep " brs"
对于 Zen4
$ cat proc/cpuinfo | grep amd_lbr_v2
以下命令生成 perf 数据文件
$ perf record --pfm-events RETIRED_TAKEN_BRANCH_INSTRUCTIONS:k -a -N -b -c <count> -o <perf_file> -- <loadtest>
(可选)将原始 perf 文件下载到主机。
要生成 AutoFDO 配置文件,可以使用两个离线工具:create_llvm_prof 和 llvm_profgen。create_llvm_prof 工具是 AutoFDO 项目的一部分,可以在 GitHub 上找到(https://github.com/google/autofdo),版本 v0.30.1 或更高版本。llvm_profgen 工具包含在 LLVM 编译器本身中。重要的是要注意 llvm_profgen 的版本不需要与 Clang 的版本匹配。它需要是 Clang 的 LLVM 19 版本或更高版本,或者只是来自 LLVM 主干的版本。
$ llvm-profgen --kernel --binary=<vmlinux> --perfdata=<perf_file> -o <profile_file>
或
$ create_llvm_prof --binary=<vmlinux> --profile=<perf_file> --format=extbinary --out=<profile_file>
请注意,可以通过以下方式将多个 AutoFDO 配置文件合并为一个
$ llvm-profdata merge -o <profile_file> <profile_1> <profile_2> ... <profile_n>
使用与步骤 1 相同的配置,使用 AutoFDO 配置文件重建内核,(请注意需要启用 CONFIG_AUTOFDO_CLANG)
$ make LLVM=1 CLANG_AUTOFDO_PROFILE=<profile_file>