从 AMD Zen 3 处理器开始,就有 INVLPGB 指令来使一系列带有广播的页面的 TLB 条目无效。正如在 AMD EPYC 7003“Milan”发布期间提到的,围绕这条新指令的 INVLPGB 使用受到限制……在过去的近四年里,INVLPGB 的使用受到限制,部分原因是 Intel CPU 不支持它,但现在有一个 Linux 内核补丁系列,用于使用 INVLPGB 获得一些不错的性能优势。
INVLPGB 是与 AMD Zen 3 处理器一起添加的,并且在较新的 Zen 处理器下也继续受支持。虽然有 GCC 编译器支持并且 KVM 代码对它的使用有限,但 Linux 内核并没有广泛使用 INVLPGB……部分原因是 Intel 工程师通常在 Linux 内核中执行大部分新的 x86 指令优化,而 Intel 处理器目前不支持 INVLPGB。
不过,今天 Meta (Facebook) 的开源开发人员 Rik van Riel 发布了一组 10 个内核问题,以开始使用 AMD 广播 TLB 失效功能。这些补丁允许内核使远程 CPU 上的 TLB 条目失效,而无需发送 IPI,也不必等待远程 CPU 处理这些中断。此外,使用此 INVLPGB 指令可以减少在这些受影响的 CPU 上运行的任何工作负载的中断。
但对于最终用户来说,最令人兴奋的是,在现代 AMD CPU 上使用 Linux 内核的这个 INVLPGB 指令的直接好处:
“结合删除不必要的 lru_add_drain 调用(参见 https://lkml.org/lkml/2024/12/19/1388),这为在具有 36 个内核的 AMD Milan 系统上进行 will-it-scale tlb_flush2_threads 测试带来了很好的性能提升:
– 原版内核:527k 循环/秒
– lru_add_drain删除:731k 循环/秒
– 仅 INVLPGB:527k 循环/秒
– lru_add_drain + INVLPGB:1157k 循环/秒仅使用 INVLPGB 更改的分析显示,虽然 TLB 失效从总 CPU 时间的 40% 下降到仅占 CPU 时间的 4% 左右,但争用只是转移到了 LRU 锁。
在这种情况下,同时修复这两个问题大约会使每秒的迭代次数增加一倍。
在这个特定的测试用例中,这些 Linux 内核补丁的吞吐量增加了一倍多……更令人惊讶的是,这些 Linux 内核补丁花了 ~4 年时间才实现,Zen 3 于 2020 年底首次亮相。这些补丁现在正在 Linux 内核邮件列表中进行审查。
转自 Linux Kernel Patches To Use AMD INVLPGB Instruction Show Huge Speed-Up – Phoronix