著名开发商 Ingo Molnar Linux 内核和 CFS(完全公平调度器)任务调度器的作者提议在内核开发者邮件列表中进行讨论。 Linux 一系列补丁影响了内核源代码中超过一半的文件,根据设置的不同,可将完整内核重建速度提高 50% 至 80%。这项优化意义重大,因为它包含了内核开发史上规模最大的更改集——一次性提交了 2297 个补丁,修改了超过 25 个文件(“include/”和“arch/*/include/”目录中的 10 个头文件以及 15 个源代码文件)。
性能提升是通过改变头文件的处理方式实现的。值得注意的是,经过三十多年的内核开发,由于文件间存在大量交叉依赖关系,头文件的状态已经变得非常糟糕。头文件重构耗时一年多,需要对层级结构和依赖关系进行大量重新设计。此次重构包括将不同内核子系统的类型定义和 API 分离出来。
所做的更改包括:将高级头文件彼此分离,排除链接头文件的内联函数,为类型和 API 分配头文件,提供单独的头文件汇编(大约 80 个文件有间接依赖关系,会干扰汇编,这些依赖关系通过其他头文件暴露出来),自动将依赖项添加到“.h”和“.c”文件,逐步优化头文件,使用“CONFIG_KALLSYMS_FAST=y”模式,选择性地将 C 文件合并到汇编块中以减少目标文件的数量。
最终,我们所做的工作使后预处理阶段处理的头文件大小减少了 1-2 个数量级。例如,优化前,使用“linux/gfp.h”头文件会导致新增 13543 行代码并包含 303 个依赖头文件;优化后,代码量减少到 181 行,依赖文件减少到 26 个。另一个例子:在未应用补丁的情况下预处理“kernel/pid.c”文件会生成 94 行代码,其中大部分在 pid.c 中未使用。拆分头文件后,处理的代码量减少了三分之二,处理的代码行数减少到 36 行。
在测试系统上使用“make -j96 vmlinux”命令进行完整内核重建时,应用这些补丁后,v5.16-rc7 分支的构建时间从 231.34 秒缩短至 129.97 秒(每小时构建次数从 15.5 次增加到 27.7 次),并且提高了构建过程中 CPU 核心的利用率。增量构建时,优化效果更加显著:修改头文件后重新构建内核所需的时间显著减少(根据修改的头文件不同,减少幅度从 112% 到 173% 不等)。目前,这些优化仅适用于 ARM64、MIPS、Sparc 和 x86(32 位和 64 位)架构。
来源: opennet.ru
