[hardware development] 深入挖掘硬件性能,Linux内核性能提升的新基线(英特尔篇)
Tofloor
poster avatar
忘怀
deepin
2026-09-30 01:10
Author

有人说,风浪越大,鱼越贵。

前言,测试程序,

内核优化是Linux发行版社区和用户群体中老生常谈的话题之一。

而性能又是一个每个人各执一词,定义复杂的问题。

从性能测试的一种定义出发,也就是性能测试的四种分类上,

分为真实程序,核心程序,小型基准测试程序,合成基准测试程序。

真实程序的例子无疑是例如WPS办公软件、浏览器和原神(启动)这样的软件或者游戏了。

不是为了衡量性能而设计的程序,也不是程序的一部分,也是最能反映用户体验的一部分。

真实程序很接近宏观性能测试,而后面更接近微观性能测试。

核心程序是是如7zip压缩软件中自带的benchmark测试,游戏软件中的性能测试这样的,

是真实程序中的核心和关键部分,是真实程序中的主要部分,好处是便于测试,缺点是毕竟不是真实程序。

小型基准测试程序往往主要测试系统的某个部分,比如处理器的整数运算或者内存性能,

但是往往只反映了整体性能的一部分,而真正的真实程序的场景的性能瓶颈往往由于木桶效应,

往往未必能被当前的基准测试程序找到。

合成基准测试程序可以理解为把小型基准测试程序拼起来来反映系统的综合性能,但是离真实程序更远了。

引言和方法

本文以在一台14代i7 14700HX台式机上编译内核默认配置arch/x86/configs/x86_64_defconfig作为性能测试优化目标,

通过AI编排实验对象自动化编译并得出测试数据,以v6.6.155的deepin内核为起点,逐项消融,多次实验去除噪声项,

精选出具有优化效果的配置项和编译优化手段,对比上游v6.6.155和v6.12.89和v6.18.53和v7.2.7原版内核版本,

在基线内核为v7.2.7版本的情况下,不断通过优化配置,编译环境编译参数,编译时间从97.92s降低到87.248s,

内核指令数instructions:k 从429.7 G降到116.1 G,编译时间下降10.9%,内核指令数下降为原有的27%。

而原有内核的内核开销sy百分比为9.747%,降到优化后的4.36%[1].

此外在基准测试程序byte-unixbench最新版本上可以获得单并发50.78%的性能提升,28线程并发获得33.53%的性能提升。

在WireGuard加密基准测试程序wg-bench多流中获得40%以上的性能提升。

极大降低内核开销也带来了极快的应用打开速度。

随着AI Agent时代的到来,极其高效的内核底层也为更高效的Agent运行提供了免费的福利,

本文的内核优化方案至少相当于1-2代的CPU正代性能提升幅度。

由于数据过多,本文为简单版本提前发布,作为送给所有自己编译内核和Linux内核DIY爱好者的节日礼物。

注1:VIRT_CPU_ACCOUNTING_GEN 到TICK_CPU_ACCOUNTING的配置修改会导致sy计算精度不同。

正文

简要介绍大致优化思路,具体的可以看后续的数据表格和后续上传的完整方案和内核包文件。

优化思路,使用perf record -g/perf report /perf top -g -F 99记录和FrameGraph火焰图观察热点函数,

观察热点函数和热点结构体中可关闭配置项如struct task_struct中的,如热点函数的不同实现方式,例如NUMA打开后的mm内存路径差异。

使用TopDown自顶向下优化方法和屋顶线优化方法和perf L2拆分PMU进行分析观察瓶颈。

观察的工具本身也带来性能开销。

本文为简要版本,笔者也同时在多架构多平台多benchmark如WPS等日常应用打开速度、续航等测试上进行测试,均有可观测的普遍的巨大改进。

A.内核基线

新版本,更新的版本。

在这几个性能测试负载上,v7.2.7 略好于v6.18.53略好于v6.12.89略好于v6.6.155/v6.6.157, LTS大版本的更新跟实际一致。

B.配置裁剪

取舍取舍,有舍有得。

极端的性能需求,为了探索Linux内核的性能上限,笔者从工作的经验出发,提出测试合并了大量的配置裁剪。

几十项微小的优化足以比肩超过一个大的优化,在这个任务上远超内核基线更新带来的优化,与后续THP透明大页的优化相当。

笔者逐步列出下面的配置调整,按需使用,绝大部分并非通用发行版可以采用。

1.英特尔平台上可以关闭非英特尔平台和x86扩展平台支持

2.编译时就关闭处理器缓解MITIGATIONS

3.关闭SECURITY子系统和AUDIT审计子系统

4.切换到HZ=250,NR_CPUS=32 关闭NUMA、MAXSMP,这会使最大受支持的CPU数量为32核以内

5.关闭KVM虚拟化虚拟机宿主支持

6.关闭MEMCG、PSI统计

7.切换ORC_UNWINDER

8.关闭harden内核加固相关选项,关闭 X86_KERNEL_IBT和影子栈来完全关掉CET STACKPROTECTOR_STRONG栈帧保护

9.关闭PREEMPT完全抢占,从NO_HZ_FULL切换到NO_HZ_IDLE,切换到TICK_CPU_ACCOUNTING

10.关闭VMAP_STACK

11.关闭LRU_GEN特性 内存充足下会引入开销

12.关闭BLK_CGROUP、BLK_WBT、NVME_MULTIPATH、BLK_DEV_ZONED提升IO性能

13.关闭FTRACE FUNCTION_TRACER 和 TRACING 性能分析和函数追踪相关

14.关闭SLUB_DEBUG、TASKSTAT、SCHEDSTAT统计相关

15.关闭32位兼容(尤其会影响32位 wine应用启动)

全量v7.2.7 .config配置参考,使用的时候务必用LLVM=-21 如果要获得最佳效果使用CLANG_AUTOFDO_PROFILE=kernel.afdo从第二个链接下载,关闭了安全和虚拟化KVM,但仍然可以做虚拟机中使用,安装包只供验证测试数据,仅适用于英特尔32核以内机型,不建议日常使用,改变配置务必不传CLANG_AUTOFDO_PROFILE,重新采样AUTOFDO或直接关闭,日常使用建议根据机器相关需要酌情增加配置

.config https://gist.github.com/opsiff/c4a1ab818486c1fa924bf027addd580a

https://github.com/opsiff/UOS-kernel/releases/tag/v7.2.7

C.编译优化

编译器的游戏,编译,编译,编译。

clang-21+THIN_LTO足够进一步优化了,gcc-16.2虽有差距,但是不大。

打开autofdo并采集,合并,准确的性能采集数据能进一步优化提升性能。

bolt优化不能直接使用,否则容易导致不开机,尤其无法和THIN_LTO和自己的bolt-21 --split-functions参数使用,也不能和mitigate retpoline使用,原因
是BOLT 重定位 __retpoline_sites / __return_sites 时可能不完整。
其余参考llvm bolt仓库优化linux内核文档。

D.硬件相关优化

通过优化机器的英特尔intel_idle驱动,添加对应机型更深的cstate支持,通过降低能耗,能进一步提升性能。

14代是 Raptor Lake 是 Alder Lake 的刷新,C-state 架构相同,直接复用
idle_cpu_adl 那一组

  • 空载功耗 33.5 ~ 39.7 W 降到 10.0 / 10.5 W,进 C6 / C10
  • 编译墙钟 −1.24% / −1.34%

14代添加方法 drivers/idle/intel_idle.c 文件
static const struct x86_cpu_id intel_idle_ids[] 数组中添加一行

X86_MATCH_VFM(INTEL_RAPTORLAKE, &idle_cpu_adl),

cpu governor选择英特尔intel-pstate的powersave和epp performance挡位

E.任务相关优化

运行时打开THP,是最大的单项优化。

详细数据表格

编译实验记录

变体/内核 类别 改动 对照 real(s) Δ% 判读
base-2 配置裁剪 现基线(v7.2.7+厂商 defconfig) — 97.846 — 锚点
nosup 配置裁剪 关 Intel 厂商支持那一串 base-2(跨窗,窗口跨 5 小时) 97.552 −0.30% 跨窗口+打折
nosec 配置裁剪 关 SECURITY 子系统 base-2(跨窗) 97.473 −0.38% 跨窗口+打折
j24/noibt 配置裁剪(-j24 口径) 关 X86_KERNEL_IBT 同窗锚 base-j24 101.322 101.122 −0.20% 口径不同(-j24),参照
j24/nopc 配置裁剪(-j24) 关 PC 相关那一串 base-j24 101.573 +0.25% 口径不同(-j24)
j24/nostats 配置裁剪(-j24) 关统计 base-j24 101.533 +0.21% 口径不同(-j24)
j24/noprcu 配置裁剪(-j24) 关 RCU 相关 base-j24 101.275 −0.05% 口径不同(-j24)
j24/noslubdbg 配置裁剪(-j24) 关 SLUB debug base-j24 101.523 +0.20% 口径不同(-j24)
j24/nohardening 配置裁剪(-j24) 关加固项一组 base-j24 101.199 −0.12% 口径不同(-j24)
j24/orc 配置裁剪(-j24) ORC 回溯器 base-j24 101.230 −0.09% 口径不同(-j24)
j24/ctxtsw 补丁(-j24) 上下文切换补丁 base-j24 101.494 +0.17% 口径不同(-j24)
j24/lto 工具链(-j24) ThinLTO base-j24 101.124 −0.20% 口径不同(-j24)
j24/maxsmp 配置裁剪(-j24) MAXSMP base-j24 101.384 +0.06% 口径不同(-j24)
j24/all 配置裁剪+工具链(-j24) 全部配置+工具链合并(无补丁) base-j24 98.840 −2.45% 信号(-j24 口径)
j24/vfsopen 补丁(-j24) vfsopen 补丁 base-j24 101.484 +0.16% 口径不同(-j24)
base-j28 锚点(负载参数) 同一内核、-j28 同窗 base-j24 101.322 97.798 −3.48% 信号(-j 参数本身的差,不是内核差)
base-j24 锚点(负载参数) 同一内核、-j24 — 101.322 — 锚点(-j24 窗口)
j24/clang 工具链(-j24) clang 编被测内核 base-j24 100.955 −0.36% 口径不同(-j24)
noibt 配置裁剪 关 X86_KERNEL_IBT base-2(跨窗) 97.554 −0.30% 跨窗口+打折;与后续同向
nohardening 配置裁剪 关加固项一组 base-2(跨窗) 97.627 −0.22% 跨窗口+打折
orc 配置裁剪 ORC 回溯器 base-2(跨窗) 97.453 −0.40% 跨窗口+打折
noprcu 配置裁剪 关 RCU 相关 base-2(跨窗) 97.604 −0.25% 跨窗口+打折
lto 工具链 ThinLTO base-2(跨窗) 97.480 −0.37% 跨窗口+打折
clang 工具链 clang-18 编被测内核 base-2(跨窗) 97.491 −0.36% 跨窗口+打折
stack 配置裁剪 把「单项有效」的配置全叠起来(orc/nosec/noibt/nosup/noprcu/…) base-2(跨窗) 96.803 −1.066% 信号方向(跨窗口+打折;筛查轮最大单项组合)
stack-clang 配置裁剪+工具链 同上 + clang base-2(跨窗) 96.456 −1.420% 信号方向(跨窗口+打折)
allbolt 配置裁剪+工具链 all 加强制重定位段(给 BOLT 用) 同窗 base 97.626 95.243 −2.441% 与 all 差 0.001%,同一物
all 配置裁剪+工具链 全部配置+工具链(无补丁) 同窗锚 base 97.626 95.242 −2.442% 信号(同窗口)
lto19 工具链 clang-19 + ThinLTO(无剖面) 同窗锚 base 97.674 96.956 −0.735% 信号(同窗口,阶段一)
autofdo-prof 工具链 PGO 四开关(不带剖面) 同窗 base 97.674 97.228 −0.457% 信号(采集代价的对照)
autofdo 工具链 + 编译负载剖面(AutoFDO) autofdo-prof 97.228 97.606 +0.389% 负收益(剖面来自编译负载,覆盖率低)
final 补丁 all + vfsopen + ctxtsw 同窗 base 97.626 95.193 −2.492% 两个补丁相对 all 只有 −0.051%
megaprof 配置裁剪+工具链 合并配置 + 判别器(无剖面) 同窗 base 97.924 95.347 −2.632% 信号;mega 相对它 −0.37%
mega 配置裁剪+工具链 合并配置 + 判别器 + 两份剖面 同窗锚 base 97.924 94.991 −2.996% 信号(同窗口,阶段二)
noshstk-noibt 配置裁剪 再关 X86_KERNEL_IBT 同窗 base 97.977 97.769 −0.212% 信号(两次独立测 IBT 同向,约 0.2%)
tune-thp 运行期 THP madvise→always 同窗 base 97.867 92.631 −5.350% 信号(四次独立:−5.35/−5.54/−3.42/−4.88)
tune-all 运行期 五项 tunes 一起 同窗 base 97.867 92.439 −5.546% 信号;相对只开 thp 的 −5.350% 只多 0.19%
hz250 配置裁剪 HZ 1000→250(写法正确) 同窗锚 base 97.866 97.279 −0.600% 信号(sys −5.0%、sy% 9.68→9.25 同向)
mega2 配置裁剪+工具链 四项加固 + 前面所有配置优化 同窗 base 97.766 95.027 −2.802% 信号;四项逐项和 0.79% ≠ 实际 0.31%
nomitig 配置裁剪 CPU_MITIGATIONS=n(全关) 同窗锚 base 97.985 97.206 −0.795% 信号(三个 mitig 子项合计 0.88%,加性检验通过)
mitig-a 配置裁剪 MITIGATION_RFDS/VMSCAPE/SPECTRE_V1=n 同窗 base 97.985 97.574 −0.419% 信号
mitig-retpoline 配置裁剪 MITIGATION_RETPOLINE=n 同窗 base 97.985 97.708 −0.283% 信号(残余编译期开销)
novmapstack 配置裁剪 VMAP_STACK=n 同窗 base 97.985 97.560 −0.434% 信号
rfds-off 运行期(cmdline) reg_file_data_sampling=off 同窗 base 97.985 97.527 −0.467% 信号(本机真在跑的那一项)
nostackprot 配置裁剪 STACKPROTECTOR_STRONG=n 同窗 base 97.948 97.654 −0.300% 弱信号,打折看
nocgsched 配置裁剪 关 cgroup 调度一组(保住 CGROUPS=y) 同窗 base 97.948 97.615 −0.340% 弱信号,打折看
nomemcg 配置裁剪 MEMCG=n 同窗锚 base 97.948 96.568 −1.409% 信号(sys −10.1%、内核指令 −17.0%)
nolrugen 配置裁剪 LRU_GEN=n 同窗 base 97.948 97.540 −0.417% 弱信号,打折看
noblkg 配置裁剪 BLK_CGROUP+BLK_WBT+NVME_MULTIPATH+BLK_DEV_ZONED=n 同窗 base 97.948 97.616 −0.339% 弱信号,打折看
noftrace 配置裁剪 FTRACE+FUNCTION_TRACER+TRACING=n 同窗 base 97.948 97.548 −0.408% 弱信号,打折看
mega3 配置裁剪+工具链 再加阶段 5/6 那 17 项 同窗锚 base 97.907 95.031 −2.937% 信号(内核指令 433.9G→311.3G)
mega4 配置裁剪+工具链 再叠 mega3→mega4 那一批 同窗 base 97.907 93.581 −4.418% 信号(内核指令 −45%,sys −32%)
mega4-t-b 运行期 mega4 + 五项 tunes 同窗锚 mega4 93.511 90.083 −3.666% 信号(五项里 thp 独大)
mega4-t-thp 运行期 mega4 + 只开 thp 同窗 mega4 93.511 90.315 −3.418% 信号(五项里另外四项合计只值 0.26%)
ab-thp-b 运行期(A/B/A) THP madvise→always(第四次确认) 同窗 A1/A2 base 97.509 92.749 −4.882% 信号(两次 base 漂移 0.842%,量值远超漂移)
ab-mount-home-b 运行期(A/B/A) /home 改 noatime 同窗 A1/A2 base 97.176 97.450 +0.282% 负收益,可信;机制没解释
kcf-o3 工具链 KCFLAGS=-O3 -fno-strict-aliasing 同窗 base 97.896 97.595 −0.307% 信号(内核指令 −5.5%,bzImage +5.3%)
lbrsys 工具链 带 LBR 的 Propeller 剖面 同窗锚 lbrprof 93.643 93.448 −0.208% 信号(Propeller 单独 −0.268%)
bolt66-prof 锚点 6.6.155 上游 + 厂商配置、clang-18,不带 BOLT — 98.221 — 锚点(BOLT 对照内核)
mega5 配置裁剪+工具链 关 lockup 两项 + 关影子堆栈 同窗 93.299 — 锚点
mega5c 配置裁剪+工具链 干净树重建的锚点 — 90.186 / 90.210 +0.027%(两次锚) 锚点
base 锚点 原厂配置基线(07 线)+ THP=always — 92.767 — 锚点(Z 窗口)
base-nothp 锚点(运行期对照) 同一个 base 内核,THP 保持 madvise 同窗 base+THP 92.767 97.920 — 参照点:mega5hz+THP 相对它是 −8.202%
hz21 工具链 clang-21 编被测内核 同窗锚 mega5hz 89.952 89.828 −0.137% 信号(方向):sys −1.74%、内核指令 −0.47%
hzprof 工具链 clang-21 + PGO 四开关(无剖面) 同窗 hz21 89.723 89.919 +0.218% 信号(PGO 机器本身是负的,指令 +0.82%)
hzprop19 工具链 + Propeller 剖面 同窗 mega5hz 89.871 89.698 −0.192% 信号:Propeller 单独 −0.234%,整套工具链换 −0.055%
mega5hz-c1pre 锚点 mega5hz(c1idle 前锚) — 89.615 — 锚点
c1idle 补丁 intel_idle 加 Raptor Lake 表项 同窗前锚 89.615 / 后锚 89.701 88.501 −1.243% / −1.338% 信号(空载省 25~30 W;sys 反而涨 3.8%)
mega5hz 锚点 现基线(裁剪+clang-19/ThinLTO+HZ=250) — 89.701 — 锚点(c1idle 后锚)
gov-perf-1(×3) 运行期 governor/EPP = performance/performance 同窗交错组基准 89.582 — 锚(三工作点交错,各 3 轮)
gov-balp-1(×3) 运行期 powersave/balance_performance perf 89.582 88.662 −1.027% 信号方向(少 5 W、频率低 60 MHz)
gov-pow-1(×3) 运行期 powersave/power perf 89.582 182.846 +104.1% 悬崖(不是噪声):33 W、1.42 GHz,90 W 墙用不满
p1-ba0 锚点 mega5hz(t1batch 前锚 1) — 89.789 — 锚点
schedmc 配置裁剪 SCHED_MC=n(连带 ITMT/SCHED_MC_PRIO) 前锚 p1-ba2 89.758 / 后锚 p1-ba3 89.874 96.573 +7.592% / +7.453% 异常;主因是 ITMT
p2-ba0 锚点 mega5hz(t2tail 前锚 1) — 89.831 — 锚点
x-ba0 锚点 mega5hz(extreme 前锚) — 89.902 — 锚点
x-natx 配置裁剪+工具链+补丁 clang-21 +X86_NATIVE_CPU + NR_CPUS=32 + c1idle 前锚 / 后锚 88.227 −1.863% / −1.938% 信号;归因只到「四项叠加」
x2-ba0 锚点 mega5hz(xnnat 前锚) — 89.825 — 锚点
x2-nnat 配置裁剪 同上四项但 X86_NATIVE_CPU=n 前锚 / 后锚 88.048 −1.978% / −1.970% 信号
bl-ba0 锚点 mega5hz(bl 前锚) — 90.089 — 锚点
bl-u66 配置裁剪+换版本 上游 v6.6.155 + 厂商配置(四点同窗) 窗口中点 90.031 98.113 +8.978% 信号(本窗最慢;sys 是锚点 2.28 倍)
bl-612 换版本 上游 v6.12.89 + 该线 defconfig 窗口中点 90.031 94.164 +4.591% 信号(相对 u66 −4.025%)
bl-618 换版本 上游 v6.18.53 + 该线 defconfig 窗口中点 90.031 93.431 +3.777% 信号(相对 612 −0.778%)
bl-72 换版本 上游 v7.2.7 + 7.2 线 defconfig(= base) 窗口中点 90.031 92.912 +3.201% 信号(相对 618 −0.556%)
pe-s1-b0 锚点 现状(P/E 分流实验前锚) — 89.789(中位) — 锚点
pe-s1-split 运行期 cc1 归 P 核、其余归 E 核 锚中点 89.6275 134.686 +50.273% 信号(慢 1.50 倍):并发被压到 12 颗核
pe-s1-rev 运行期 错配:cc1 归 E 核、其余归 P 核 锚中点 89.6275 154.748 +72.657% 信号(慢 1.73 倍);同样被并发压缩污染
af-ba0 锚点 mega5hz(AutoFDO 完整形态前锚) — 89.569 — 锚点
af-prof 工具链 PGO 四开关(无剖面) 窗口中点 89.566 89.810 +0.272% 信号(PGO 机器本身的代价)
af-afdo 工具链 + 正确剖面(llvm-profgen) 上一步 89.810 89.396 −0.461% 信号
af-prop 工具链 + Propeller 上一步 89.396 89.584 +0.210% 与历史 −0.234% 方向相反,不下结论
af-afdo21 工具链 同剖面上换 clang-21 上一步 89.396 89.244 −0.170% 略高于 MDE
cmb-ba0 锚点 mega5hz(合并版前锚) — 89.600 — 锚点
cmb-plain 补丁+工具链+配置裁剪 c1idle+NR_CPUS=32+clang-21+AutoFDO 机器开关(不给剖面) 窗口中点 89.576 87.847 −1.931% 信号
cmb-afdo 工具链 同一配置 + 剖面 上一步 87.847 87.248 −2.599% 信号
p3-ba0 锚点 mega5hz(schedmc 拆因子前锚) — 89.802 — 锚点
priooff 运行期 运行时关 ITMT(sched_itmt_enabled=0) 前锚 89.802 / 后锚 p3-ba1 89.659 96.297 +7.233% / +7.404% 信号:7.5% 异常主因就是 ITMT
schedmc2 配置裁剪 SCHED_MC=n(编译期,连带 SCHED_MC_PRIO) 前锚 p3-ba1 / 后锚 p3-ba2 89.644 96.787 +7.950% / +7.967% 信号
rt2-gov-sp-*(×3) 运行期扫描 governor/EPP = powersave/performance 窗口 A 交错组 rt2-gov-pp-* 87.402 85.190 −2.530% 信号
rt2-gov-sb-*(×3) 运行期扫描 powersave/balance_performance 交错组 87.402 89.063 +1.900% 信号(少 7.2 W,慢在「同时干活的核少了」)
rt2-gov-pp-*(×3) 运行期扫描 performance/performance(交错基准) 后锚 rt2-anchor-a1 87.605 87.402 −0.233% 窗口 A 场内参照
rt2-idle-teo-*(×3) 运行期扫描 cpuidle governor menu→teo 同窗 menu 87.492 87.829 +0.386% 刚过 0.3% 门槛,两套口径一致
cmbnp-afdo 锚点 前锚 hzcmb21af — 87.700 — 锚点
cmbnp-np 工具链 去掉 PROPELLER_CLANG 开关 窗口中点 87.674 87.516 −0.181% 刚过 MDE,只当方向
cmbnp-ba1 锚点 后锚 hzcmb21af — 87.649 — 锚点
v73-ba0 锚点 hzcmb21af(7.3 窗前后锚,同一二进制) — 87.395 — 锚点
v73-plain v7.3 换版本 7.3-rc5 上游 + 7.2 线 defconfig + gcc(不裁剪) 前锚 87.395 92.569 +5.891%(后二轮) 合成差,不是「7.3 更慢」的干净读数
v73-opt v7.3 换版本 同底座 + 现最优栈(裁剪+c1idle+clang-21/ThinLTO,不带剖面) 同窗 v73-plain 92.379(后二轮) 87.707 −5.097%(后二轮) 信号:栈在 7.3 上是 −5.10%(全三轮 −5.253%)
v73-ba1 锚点 后锚 hzcmb21af — 87.349 — 锚点
bq-o3 重编参数 KCFLAGS=-O3 -fno-strict-aliasing+WERROR=n 同窗两锚中点 87.134(后二轮) 87.507 +0.428% 超出 MDE → 偏慢
bq-i50 重编参数 -mllvm -import-instr-limit=50 中点 87.094 87.486 +0.450% 超出 MDE,漂移超限要打折
bq-cg3 重编参数 --lto-CGO3 中点 87.084 87.451 +0.421% 超出 MDE,漂移超限要打折
bq-six 重编参数 六项合并(CPA/PKU/RESCTRL/KALLSYMS_ALL=n+v3+-O3) 中点 87.054 87.455 +0.460% 超出 MDE;
bq-afp 重编参数 Propeller(D 路替代) 中点 87.147 87.537 +0.448% 超出 MDE,方向可信、漂移超限要打折

内核源码地址

https://github.com/deepin-community/kernel

致谢

本文作者是deepin内核的主要维护者,本文受到统信软件的同事的大力支持和社区同仁的支持。

感谢DeepSeek v4.1 flash和Kimi K3 Max为本文实验数据做出的贡献。

Reply Favorite View the author
All Replies
avatar
忘怀
deepin
2026-09-30 01:48
#1
name: linux-kernel-build-perf-intel
description: 基于 deepin 内核维护者实验文章的 Intel x86_64 Linux 内核编译性能优化 skill:配置裁剪、clang/ThinLTO/AutoFDO、运行期 THP/governor/intel_idle 调优与数据化验证。

Skill:Linux 内核编译性能优化(Intel x86_64)

来源:deepin 内核维护者《深入挖掘硬件性能,Linux 内核性能提升的新基线(英特尔篇)》。
目标:在 Intel x86_64 平台上,以 v7.2.7 为基线,通过配置裁剪、编译优化、运行期调优,把编译时间从 97.92s 降到 87.248s,内核指令数 instructions:k 从 429.7G 降到 116.1G,sy% 从 9.747% 降到 4.36%,并提升 UnixBench、wg-bench 等负载性能。
定位:性能探索 / 专用机 / 内核 DIY。不是生产安全加固方案。

1. 适用与禁止

适用

  • Intel x86_64,尤其是 14 代 i7 14700HX / 32 核以内机器。
  • 愿意自行编译内核,接受关闭安全、审计、虚拟化宿主、加固等特性。
  • 追求编译速度、内核指令数、sy%、应用打开速度、基准测试提升。

禁止 / 强警告

  • 不建议日常使用。文章中的 .config 安装包仅用于验证测试数据,仅适用于 Intel 32 核机型。
  • 关闭 MITIGATIONS、SECURITY、AUDIT、KVM、CET、影子栈、STACKPROTECTOR_STRONG 会降低安全性。
  • 关闭 32 位兼容会影响 32 位 Wine 应用启动。
  • 改变配置后务必不要传 CLANG_AUTOFDO_PROFILE,应重新采样 AutoFDO 或直接关闭。
  • BOLT 不能直接使用,容易导致无法开机,尤其不能和 THIN_LTO 以及 bolt-21 --split-functions 混用。

2. 核心原则

  1. 版本优先:v7.2.7 略好于 v6.18.53,略好于 v6.12.89,略好于 v6.6.155/v6.6.157。
  2. 数据驱动:用 perf record -g、perf report、perf top -g -F 99、FrameGraph 火焰图、TopDown、屋顶线、perf L2 拆分 PMU 找热点。
  3. 逐项消融:同窗锚点、A/B/A、多次实验去噪,注意跨窗口漂移、-j24/-j28 口径不可混比。
  4. 优化顺序:配置裁剪 > 编译工具链 > 运行期调优;运行期 THP 是最大单项。
  5. 保持 ITMT:不要关 SCHED_MC 连带 ITMT/SCHED_MC_PRIO,否则会出现约 +7.5% 的异常变慢。

3. 操作流程

步骤 1:准备源码与基线

  • 源码:https://github.com/deepin-community/kernel
  • 参考配置:https://gist.github.com/opsiff/c4a1ab818486c1fa924bf027addd580a
  • 参考包:https://github.com/opsiff/UOS-kernel/releases/tag/v7.2.7
  • 建立基线:原版 v7.2.7 defconfig,记录 real(s)、instructions:k、sy%、sys、基准测试。
  • 编译时务必使用 LLVM=-21。最佳效果可配合 CLANG_AUTOFDO_PROFILE=kernel.afdo。

步骤 2:配置裁剪清单

按需使用,Intel 平台优先:

  • 平台:关闭非 Intel 平台和 x86 扩展平台支持;可开 X86_NATIVE_CPU。
  • CPU/拓扑:HZ=250、NR_CPUS=32;关闭 NUMA、MAXSMP。
  • 安全/审计:关闭 CPU_MITIGATIONS、SECURITY、AUDIT。
  • 加固/CET:关闭 harden、X86_KERNEL_IBT、影子栈、CET、STACKPROTECTOR_STRONG。
  • 虚拟化:关闭 KVM 宿主支持。
  • 内存/统计:关闭 MEMCG、PSI、LRU_GEN、SLUB_DEBUG、TASKSTAT、SCHEDSTAT。
  • 抢占/时钟:关闭 PREEMPT;从 NO_HZ_FULL 切到 NO_HZ_IDLE;切到 TICK_CPU_ACCOUNTING。
  • 栈/回溯:关闭 VMAP_STACK;切换 ORC_UNWINDER。
  • IO/块:关闭 BLK_CGROUP、BLK_WBT、NVME_MULTIPATH、BLK_DEV_ZONED。
  • 追踪:关闭 FTRACE、FUNCTION_TRACER、TRACING。
  • 兼容:关闭 32 位兼容。

不要关

  • SCHED_MC / ITMT / SCHED_MC_PRIO:关闭后异常慢约 +7.5%。
  • /home noatime:负收益,不采用。
  • cpuidle governor menu → teo:约 +0.386%,不推荐。

步骤 3:编译优化

  • 工具链:clang-21 + THIN_LTO 足够;gcc-16.2 差距不大。
  • AutoFDO:打开 PGO 四开关,采集、合并准确性能采集数据;正确性能采集数据约 -0.461%,合并版可达 -2.599%。
  • 不要用编译负载的性能采集数据:覆盖率低,约 +0.389% 负收益。
  • 可尝试 KCFLAGS=-O3 -fno-strict-aliasing,但结果不稳定;--lto-CGO3、-mllvm -import-instr-limit=50 有信号但漂移超限。
  • BOLT:不直接使用,尤其不能和 THIN_LTO、bolt-21 --split-functions 混用。

步骤 4:硬件与运行期优化

  • intel_idle:添加对应机型,如 Raptor Lake 的更深 C-state;空载可省 25~30W,编译约 -1.24%~-1.34%。
  • Governor/EPP:选择 intel-pstate 的 powersave/performance;比 performance/performance 约 -2.53%。powersave/balance_performance 慢约 +1.9%,powersave/power 会出现性能悬崖。
  • THP:运行期 madvise → always,最大单项,约 -5.35%;四次独立信号 -5.35/-5.54/-3.42/-4.88。五项 tunes 一起约 -5.546%,THP 独大。
  • 保持 ITMT 开启;运行时关 ITMT 会慢 +7.23%~+7.4%。

步骤 5:验证

  • 编译:real(s),注意 -j24 与 -j28 不可混比。
  • 内核:perf stat 看 instructions:k、sys、sy%。
  • 基准:UnixBench 单并发 +28 线程、wg-bench 多流。
  • 真实程序:WPS、浏览器、应用打开速度、续航。
  • 最终参考:编译时间 97.92s → 87.248s,下降 10.9%;instructions:k 429.7G → 116.1G,降至 27%;sy% 9.747% → 4.36%;UnixBench 单并发 +50.78%,28 线程 +33.53%;wg-bench 多流 +40% 以上。

4. 快速检查清单

  • 选择 v7.2.7 基线。
  • 备份数据,确认仅用于实验机。
  • 下载参考 .config 和 AutoFDO 性能采集数据。
  • 应用 Intel 平台配置裁剪。
  • 使用 LLVM=-21 编译。
  • 最佳效果使用 CLANG_AUTOFDO_PROFILE=kernel.afdo。
  • 改配置后不传 AutoFDO,重新采样或关闭。
  • 运行期开 THP=always,governor 用 powersave/performance。
  • 保持 ITMT,不要关 SCHED_MC。
  • 用同窗锚点、A/B/A 验证,避免跨窗口漂移误判。
  • 若开机失败,优先怀疑 BOLT、THIN_LTO、AutoFDO 性能采集数据、过度裁剪、ITMT 关闭。

5. 最终产物

  • 参考 .config:https://gist.github.com/opsiff/c4a1ab818486c1fa924bf027addd580a
  • 参考内核包:https://github.com/opsiff/UOS-kernel/releases/tag/v7.2.7
  • 源码:https://github.com/deepin-community/kernel

该 skill 的完成判定:在匹配硬件上可复现编译时间下降、instructions:k 下降、sy% 下降,且 UnixBench / wg-bench 有可观测提升;若未达到,回退到上一个同窗锚点并重新消融。

Reply View the author
avatar
jjcui8595
deepin
2026-09-30 10:06
#2

like

Reply View the author
avatar
zl188
deepin
2026-10-10 10:00
#3

感谢分享

Reply View the author