Caching Linux是否使用x86CPU';TLB的PCID功能?若否,原因为何?

Caching Linux是否使用x86CPU';TLB的PCID功能?若否,原因为何?,caching,assembly,linux-kernel,operating-system,x86,Caching,Assembly,Linux Kernel,Operating System,X86,我写了一个内核模块来检查CR4.PCIDE,它没有设置。为什么Linux不使用这种特性来减少由于TLB失效和缓存污染而导致的性能下降 更新:由于2017年末和2018年初发生的变化,这一情况在4.15左右发生了变化。有关详细信息,请参阅 注意:我不是Linux开发人员 对于Intel的“进程上下文标识符”,有4096个ID的限制。这意味着,当有超过4096个进程时,您需要对其进行管理(例如,可能会执行“最近使用最少的”操作,这样,如果当前没有ID的进程需要执行,那么该ID将从其他进程中获取并重用

我写了一个内核模块来检查CR4.PCIDE,它没有设置。为什么Linux不使用这种特性来减少由于TLB失效和缓存污染而导致的性能下降

更新:由于2017年末和2018年初发生的变化,这一情况在4.15左右发生了变化。有关详细信息,请参阅

注意:我不是Linux开发人员

对于Intel的“进程上下文标识符”,有4096个ID的限制。这意味着,当有超过4096个进程时,您需要对其进行管理(例如,可能会执行“最近使用最少的”操作,这样,如果当前没有ID的进程需要执行,那么该ID将从其他进程中获取并重用)

另一件事是多CPU系统上的“TLB故障排除”。这些可能会有点贵,所以人们会采取一些措施来避免它们。例如,如果一个进程只有一个线程,那么它只能在一个CPU上运行,并且您知道不需要向其他CPU发送IPI(中断它们并要求它们执行“TLB分解”)。一旦您开始使用PCID,您就无法确保其他CPU没有TLB条目,也无法使用这些技巧来避免“TLB崩溃”。这还意味着(理论上,对于实施不当的PCID支持),您从PCID中获得的性能可能小于由于未使用TLB故障和ID管理开销而损失的性能,从而导致净损失

我想说的主要是,添加对PCID的支持有点复杂(这不是说你可以在CR4中设置一个标志然后忘记它)。您必须进行一些研究(实验、原型、基准测试),以确定最有效的实现方法。对于大型/复杂/旧内核(如Linux),它将更加复杂,因为您必须小心不要意外地打乱其他东西。另一件事是,这个功能相对较新(如果我没记错的话,它只存在了几年),并且不受很多CPU的支持(例如,任何稍旧一点的,以及任何来自AMD的)


基本上,我会假设它归结为“时间与效益”(或者,在有限数量的CPU上没有足够的时间进行小的性能改进)。

是的!Linux内核的最新版本具有PCID支持。在提出此问题时,此支持并不存在,但已于2017年底添加,从开始。您可以按照最初的补丁讨论进行操作

这一更改实际上并没有将每个进程关联到一个唯一的PCID,因为数量有限,或者尝试将它们分配给频繁使用的基础,而是在每个CPU上使用PCID缓存,因此给定CPU上的多个运行进程可能能够使用PCID机制来避免TLB刷新开销

这一点最近变得更为重要,因为where发现了允许非特权用户代码读取内核内存的方法,而内核内存正是针对该方法部署的。这些补丁可能会对性能产生重大影响,因为用户级TLB条目在任何内核调用中都可能无效。有了PCID支持,由于保留了用户级TLB条目,因此影响减小


在发布的内核中没有PCID支持时,可以在下面找到此答案的旧版本:

还没有,但似乎有些事情正在酝酿之中。请参见从LKML开始的线程。特别是,有针对跨核心TLB拆除问题的建议解决方案,其中包括:

如果在接收非当前PCID的TLB故障排除时,我们 刷新该PCID的所有条目,并从mm中移除CPU cpu_vm_mask_var,我们将永远不会收到超过一个的射击IPI 一个非当前mm,但我们仍将获得TLB寿命的好处 处理任务轮流运行的管道工作负载时 相同的CPU


您还可以从该线程中了解到,地址空间标识符长期以来一直用于其他Linux体系结构。

16个ID的限制从何而来?对不起,我没有得到它。我记错了(不是16个ID)-我检查了一下,实际上有4096个ID(因为它是CR3中的一个12位字段)。我更改/更正了我的答案。你应该在第一句话中总结:否:-)注意,我认为没有证据表明PCID补丁必然与幽灵或熔毁攻击有关。很自然,PCID最终将被用于更有效的上下文切换,而补丁的出现比幽灵和熔毁带来的巨大推动要早得多。此外,Meldown fix(KPTI)将应用到的内核要比那些支持PCID的内核大得多。请注意,从2017年开始:因为4.14 Linux确实使用了它,但有点不寻常,第
1.8段。使用PCID更快地刷新TBL
。刚找到“1.10”。在上面的Hi Angel答案中,使用PCID'的TLB条目寿命更长,但它非常有用。