在技术领域,优化性能的途径通常有两种:一种是通过提升硬件性能,另一种则是通过提高软件效率。无论哪种方式,只要能带来实际的提升,社区都会给予热烈的欢迎。最近,Intel 核心测试机器人通过在 Linux 内核中提交了一行代码,发现了一项令人惊叹的性能提升。根据测试,内存分配的吞吐量提升了 3889%,也就是接近 40 倍的速度提升!这一变化的实现仅仅依靠了一行代码的提交。
性能提升:核心测试揭示的惊人效果
这项测试的核心成果出现在 “will-it-scale” 扩展性测试中,该测试是通过一台搭载 Intel Xeon Platinum 8380H 处理器的系统进行的。此处理器是基于 Cooper Lake 架构,拥有 4 个插槽和 224 个线程(每个 Xeon Platinum 8380H 处理器有 28 核 56 线程)。在这项测试中,1 字节内存分配(malloc1)的吞吐量实现了接近 40 倍的提升,展示了内核优化的巨大潜力。
这项优化是在以下提交中实现的:
- 提交信息:d4148aeab412432bf928f311eca8a2ba52bb05df
- 改动概述:该提交优化了内存管理(mm)和内存映射(mmap),特别是在透明大页(THP)和页面中间目录(PMD)之间的对齐。
内存管理的深度优化
这次提交的优化与 Linux 内核中的内存管理系统紧密相关,特别是涉及到透明大页(THP)和页面中间目录(PMD)对齐的问题。为了提升内存分配效率,内核团队在这项改动中修复了一个长期存在的问题:由于页面中间目录(PMD)对齐的问题,转换旁路缓冲区(TLB)和缓存别名问题曾导致性能回退。
早在提交 efa7df3e3bb5 时,内核就开始尝试将较大的匿名映射对齐到 THP 边界。这意味着,如果一个匿名映射的大小足够大,它会自动对齐到 PMD 边界,并受益于 THP 的性能提升。然而,这种改动也引发了一些性能回退,特别是在处理像 cactusBSSN 这样的基准测试时,性能有时甚至会下降 600%。
性能回退问题的修复
通过对回退问题的深入分析,内核团队发现,在某些工作负载下,基准测试的内存访问模式会遭遇 TLB 或缓存别名问题,从而导致性能下降。尤其是在 cactusBSSN 基准测试中,创建了多个小的 4632kB 区域,这些区域在之前会被合并成一个大区域,但在新的提交中被拆分并对齐到 PMD 边界,导致性能问题。
为了解决这一问题,内核团队对条件进行了修改,现在要求映射的大小必须是 PMD 大小的倍数,而不仅仅是“大于等于 PMD 大小”。这种调整可以有效避免像 cactusBSSN 基准测试那样生成不规则的映射,从而恢复了原本的性能。
巨大性能提升的实际意义
值得注意的是,这次性能提升是在一个合成测试用例中实现的,因此现实世界中的工作负载可能无法实现如此惊人的性能提升。然而,这项优化依然为 Linux 内核的未来发展带来了积极的前景,尤其是在需要高效内存管理的场景中,性能提升的潜力非常巨大。
总结:内核优化带来的巨大改变
这次 Linux 内核的优化通过一行代码实现了性能的巨大提升,证明了即使是微小的改动,也能对系统的性能产生深远影响。虽然这项改进在合成测试中表现出色,但它仍为 Linux 内核的未来优化提供了宝贵的经验,尤其是在内存管理和性能优化方面。随着更多此类优化的出现,Linux 系统在高负载、高性能应用场景下的表现将更加出色,预计会在各类工作负载中带来更高的效率和更低的资源消耗。