由于间接分支限制推测(IBRS)导致Intel Xeon可扩展双插槽服务器性能下降25%,Red Hat的Waiman Long一直在开发一个补丁系列,以更新Linux上受影响的Intel处理器在不同条件下的IBRS处理。
今天在TIP的sched/core分支中排队的是
x86/idle:CPU脱机时禁用IBRS以提高单线程性能
.正如Waiman Long在前面解释的那样
补丁程序系列
在邮件列表上:
对于需要打开IBRS以防止Spectre v2和Retbleed的英特尔处理器,SPEC_CTRL MSR中的IBRS位会影响整个内核的性能,即使在内核中运行时只有一个线程打开它。对于占用大量用户空间的应用程序,在系统调用期间偶尔打开IBRS对性能的影响应该不会很大。不幸的是,当同级线程在内核中空闲时,情况并非如此。在这种情况下,性能影响可能是显著的。
当DPDK在一个独立的CPU线程上运行时,在用户空间中处理网络数据包,而其同级线程处于空闲状态。在同级空闲线程中IBRS打开和关闭的繁忙DPDK线程的性能为:
IBRS打开IBRS关闭
---------------
包/秒:7.8M 10.4M
平均tsc周期/包:282.26 209.86这是25%的性能下降。测试系统是一个英特尔至强4114 CPU@2.20GHz。
Commit bf5835bcdb96(“intel_idle:Disable IBRS during long idle”)在CPU进入长空闲(C6或更低)时禁用IBRS。然而,也有一些现有用户设置了“intel_idle.max_state=1”来减少延迟。这些用户将无法从该提交中获益。此补丁系列通过提供新的“intel_idle.ibs_off”模块参数来扩展此提交,即使在“intel_didle.max_state=1”的情况下也会强制禁用ibrs,代价是增加IRQ响应延迟。它还包括一个提交,允许在CPU脱机时禁用IBRS。
补丁消息接着补充道:“
Commit bf5835bcdb96(“intel_idle:在长空闲期间禁用IBRS”)在CPU进入长空闲时禁用IBRS。但是,当CPU变为脱机时,在启用X86_FEATURE_KERNEL_IBRSis时,IBRS位仍然设置。这将影响同级CPU的性能。通过在脱机时清除SPEC_CTRL MSR中的所有缓解位来减轻这种性能影响。当CPU再次联机时,它将被重新初始化,因此不需要恢复SPEC_CTRL值。
“
作为补丁系列的一部分
intel_idle.ibrs_off
正在引入模块参数。那个
色斑
在TIP的sched/core中也单独指出了一些不错的好处:
在Skylake服务器的max_cstate=1的情况下,这个新的ibrs_off选项可能会增加IRQ响应延迟,因为IRQ现在将被禁用。
在Skylake系统上将cstates设置为C1的情况下运行SPECjbb2015时。
第一次测试内核启动时使用:“intel_idle.ibs_off”:
最大jOPS=117828,临界jOPS=66047
然后在没有添加“intel_idle.ibs_off”的情况下启动内核时重新测试:
最大jOPS=116408,临界jOPS=58958
这意味着使用“intel_idle.ibs_off”启动可以通过以下方式提高性能:
最大jOPS:+1.2%,这可以被认为是噪声范围。
关键的jOPS:+12%,这绝对是一个坚实的改进。
With these patches having made it into a TIP.git branch, it's material expected to be submitted when the Linux 6.7 merge window opens in about one month.