出品| CSDN(ID:)
作为Linux内核的创建者,Linus的技术水平一直受到高度评价。近日,他再次用实际行动证明了自己的能力:仅通过优化21行代码,就将Linux内核的多线程性能提升了2.6%。
不出所料,这引起了开源社区的广泛关注。不少开发者感叹:“老板果然是老板,不轻易出手,但一旦出手,却让所有人惊叹不已。”
和漏洞及其影响
据了解,此次更改的核心代码提交称为x86/:避免在64位中使用()。顾名思义,本次优化调整主要是去掉()函数中的()。
在进一步讨论优化之前,我们可能需要了解一下()的由来——它涉及到2018年披露的两个重大CPU漏洞:和。
2018年,漏洞和漏洞给全球硬件和操作系统厂商带来了巨大的安全威胁。这些漏洞主要利用现代CPU中的“预测执行”机制,即通过预测要执行的代码来提前加载指令和数据。这节省了实际执行过程中的等待时间。本质上,这个功能可以极大地提高系统的运行效率,但它的缺陷是,如果CPU预测错误,缓存中存储的数据可能会被攻击者获取。由此看来,该漏洞主要影响Intel CPU,同时影响Intel、AMD、ARM等多种架构。
为了缓解这些漏洞,从2018年开始,Linux内核引入了()等方法,可以用来防止特定情况下的预测执行,从而保证系统的安全。但此类补丁的引入也会导致性能明显下降,尤其是在频繁使用系统调用或多线程切换的场景下。
例如,高级性能架构师 Gregg 曾对存在漏洞的 Linux 补丁 KPTI 进行了测试,并明确指出该补丁确实会导致 CPU 性能大幅下降:在某些极端情况下,KPTI 补丁的性能开销甚至超过 800%,而且很高频繁调用的代理服务器和数据库等应用程序尤其受到影响。
优化变化及其影响
并且一直是性能优先的坚定支持者。他认为安全补丁很重要,但不应以牺牲太多性能为代价。
基于此,()函数中的()在本次优化调整中被去掉,替代方案是使用指针掩码技术来处理地址:Linus解释道:“64位()中的()函数运行非常慢。如果地址无效,可用于强制用户指针全部为 1。
简而言之,当在用户模式下检测到无效地址时,该优化会将所有地址设置为“1”,从而避免无效地址带来的不必要的操作。下面是代码的具体修改。可以看到只涉及21行代码:
根据Linux内核测试机器人的反馈,在多线程环境下,这一改变在基准测试中实现了2.6%的性能提升——尽管表面上看起来只有微小的2.6%,考虑到Linux正在数百万台计算机上运行跨服务器、云服务和本地设备,这种性能的提升将为全球带来巨大的好处。
对x86架构的深入理解也是此次优化的关键原因之一。正是因为他在处理器架构方面的技术专长,才能够在保证安全的同时,最大化性能。这也让不少人想起,在Linux基金会成立之前,他就收到了一家芯片厂商的邀请:要求他为VLIW芯片的构建提供底层专业知识。最终,该芯片可以通过模拟运行x86-32代码。
据悉,这一变化将在即将发布的 Linux 6.12 稳定版中发布,作为性能优化的一部分。纵观Linux 6.12的开发过程,各种改进和稳定性增强已经通过多个rc版本逐步测试和发布,其中包括许多其他修复和改进,例如对文件系统和各种Bug的修复。
从目前来看,如果一切顺利的话,Linux 6.12稳定版将于11月17日发布。
参考链接:


