忘怀
deepin
2026-09-30 01:48 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. 核心原则
- 版本优先:
v7.2.7略好于v6.18.53,略好于v6.12.89,略好于v6.6.155/v6.6.157。 - 数据驱动:用
perf record -g、perf report、perf top -g -F 99、FrameGraph 火焰图、TopDown、屋顶线、perf L2 拆分 PMU 找热点。 - 逐项消融:同窗锚点、A/B/A、多次实验去噪,注意跨窗口漂移、
-j24/-j28口径不可混比。 - 优化顺序:配置裁剪 > 编译工具链 > 运行期调优;运行期
THP是最大单项。 - 保持 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 Like 2 View the 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 那一组
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,是最大的单项优化。
详细数据表格
编译实验记录
base-2nosupbase-2(跨窗,窗口跨 5 小时)nosecSECURITY子系统base-2(跨窗)j24/noibtX86_KERNEL_IBTbase-j24101.322j24/nopcbase-j24j24/nostatsbase-j24j24/noprcuRCU相关base-j24j24/noslubdbgbase-j24j24/nohardeningbase-j24j24/orcbase-j24j24/ctxtswbase-j24j24/ltobase-j24j24/maxsmpMAXSMPbase-j24j24/allbase-j24j24/vfsopenvfsopen补丁base-j24base-j28-j28base-j24101.322-j参数本身的差,不是内核差)base-j24-j24j24/clangbase-j24noibtX86_KERNEL_IBTbase-2(跨窗)nohardeningbase-2(跨窗)orcbase-2(跨窗)noprcuRCU相关base-2(跨窗)ltobase-2(跨窗)clangbase-2(跨窗)stackbase-2(跨窗)stack-clangbase-2(跨窗)allboltall加强制重定位段(给 BOLT 用)base97.626all差 0.001%,同一物allbase97.626lto19base97.674autofdo-profbase97.674autofdoautofdo-prof97.228finalall+vfsopen+ctxtswbase97.626all只有 −0.051%megaprofbase97.924mega相对它 −0.37%megabase97.924noshstk-noibtX86_KERNEL_IBTbase97.977IBT同向,约 0.2%)tune-thpmadvise→alwaysbase97.867tune-allbase97.867hz250HZ1000→250(写法正确)base97.866sys−5.0%、sy%9.68→9.25 同向)mega2base97.766nomitigCPU_MITIGATIONS=n(全关)base97.985mitig-aMITIGATION_RFDS/VMSCAPE/SPECTRE_V1=nbase97.985mitig-retpolineMITIGATION_RETPOLINE=nbase97.985novmapstackVMAP_STACK=nbase97.985rfds-offreg_file_data_sampling=offbase97.985nostackprotSTACKPROTECTOR_STRONG=nbase97.948nocgschedCGROUPS=y)base97.948nomemcgMEMCG=nbase97.948sys−10.1%、内核指令 −17.0%)nolrugenLRU_GEN=nbase97.948noblkgBLK_CGROUP+BLK_WBT+NVME_MULTIPATH+BLK_DEV_ZONED=nbase97.948noftraceFTRACE+FUNCTION_TRACER+TRACING=nbase97.948mega3base97.907mega4mega3→mega4那一批base97.907sys−32%)mega4-t-bmega4+ 五项 tunesmega493.511mega4-t-thpmega4+ 只开 thpmega493.511ab-thp-bmadvise→always(第四次确认)base97.509ab-mount-home-b/home改noatimebase97.176kcf-o3KCFLAGS=-O3 -fno-strict-aliasingbase97.896lbrsyslbrprof93.643bolt66-profmega5mega5cbaseZ窗口)base-nothpbase内核,THP 保持madvisebase+THP 92.767mega5hz+THP 相对它是 −8.202%hz21mega5hz89.952sys−1.74%、内核指令 −0.47%hzprofhz2189.723hzprop19mega5hz89.871mega5hz-c1premega5hz(c1idle 前锚)c1idleintel_idle加 Raptor Lake 表项sys反而涨 3.8%)mega5hzgov-perf-1(×3)gov-balp-1(×3)perf89.582gov-pow-1(×3)perf89.582p1-ba0mega5hz(t1batch 前锚 1)schedmcSCHED_MC=n(连带 ITMT/SCHED_MC_PRIO)p1-ba289.758 / 后锚p1-ba389.874p2-ba0mega5hz(t2tail 前锚 1)x-ba0mega5hz(extreme 前锚)x-natxX86_NATIVE_CPU+NR_CPUS=32+c1idlex2-ba0mega5hz(xnnat 前锚)x2-nnatX86_NATIVE_CPU=nbl-ba0mega5hz(bl 前锚)bl-u66v6.6.155+ 厂商配置(四点同窗)sys是锚点 2.28 倍)bl-612v6.12.89+ 该线 defconfigbl-618v6.18.53+ 该线 defconfigbl-72v7.2.7+ 7.2 线 defconfig(=base)pe-s1-b0pe-s1-splitcc1归 P 核、其余归 E 核pe-s1-revcc1归 E 核、其余归 P 核af-ba0mega5hz(AutoFDO 完整形态前锚)af-profaf-afdollvm-profgen)af-propaf-afdo21cmb-ba0mega5hz(合并版前锚)cmb-plainc1idle+NR_CPUS=32+clang-21+AutoFDO 机器开关(不给剖面)cmb-afdop3-ba0mega5hz(schedmc 拆因子前锚)priooffsched_itmt_enabled=0)p3-ba189.659schedmc2SCHED_MC=n(编译期,连带SCHED_MC_PRIO)p3-ba1/ 后锚p3-ba289.644rt2-gov-sp-*(×3)rt2-gov-pp-*87.402rt2-gov-sb-*(×3)rt2-gov-pp-*(×3)rt2-anchor-a187.605rt2-idle-teo-*(×3)menu→teomenu87.492cmbnp-afdohzcmb21afcmbnp-npPROPELLER_CLANG开关cmbnp-ba1hzcmb21afv73-ba0hzcmb21af(7.3 窗前后锚,同一二进制)v73-plainv73-optv73-plain92.379(后二轮)v73-ba1hzcmb21afbq-o3KCFLAGS=-O3 -fno-strict-aliasing+WERROR=nbq-i50-mllvm -import-instr-limit=50bq-cg3--lto-CGO3bq-sixKALLSYMS_ALL=n+v3+-O3)bq-afp内核源码地址
https://github.com/deepin-community/kernel
致谢
本文作者是deepin内核的主要维护者,本文受到统信软件的同事的大力支持和社区同仁的支持。
感谢DeepSeek v4.1 flash和Kimi K3 Max为本文实验数据做出的贡献。