Linux kernel 在mmap()时避免平移旁视缓冲区(TLB)污染

Linux kernel 在mmap()时避免平移旁视缓冲区(TLB)污染,linux-kernel,x86,intel,micro-optimization,tlb,Linux Kernel,X86,Intel,Micro Optimization,Tlb,当我们想要写入数据项时,首先将包含数据的块带入缓存,然后将数据项写入缓存。这可能导致缓存污染。为了避免这种情况,英特尔没有引入时态指令 如果我打算使用mmap()将数据写入文件,并且不再读取,那么有可能避免为此创建TLB条目吗?是否有类似于非时态指令的指令可用?CPU需要TLB条目来从虚拟地址映射到物理地址,因此使用mmap()或任何类似的API都无法避免它们 即使可以避免将映射存储在TLB中,对映射内存的每次访问都需要从页表中重新加载相应的条目,因此性能会差得多。 非时态访问仅对存储有意义,但

当我们想要写入数据项时,首先将包含数据的块带入缓存,然后将数据项写入缓存。这可能导致缓存污染。为了避免这种情况,英特尔没有引入时态指令


如果我打算使用mmap()将数据写入文件,并且不再读取,那么有可能避免为此创建TLB条目吗?是否有类似于非时态指令的指令可用?

CPU需要TLB条目来从虚拟地址映射到物理地址,因此使用
mmap()
或任何类似的API都无法避免它们

即使可以避免将映射存储在TLB中,对映射内存的每次访问都需要从页表中重新加载相应的条目,因此性能会差得多。
非时态访问仅对存储有意义,但页表条目是读取的。

不,我很确定没有,因为不能将hugepages用于文件备份映射。使用
write
时,缓冲区大小可能为二级缓存大小的1/2或类似的大小,实际上可能会执行得更好;你应该测试一下。(尽管内核问题在将缓冲区复制到页面缓存时不会使用NT存储)。如果文件数据在很长一段时间内不会被引用,您可以通过使用
madvise(MADV\u DONTNEED)
鼓励内核在写入磁盘后将其从RAM中删除,从而避免页面缓存污染。pwrite()可能比write()更合适,具体取决于您的访问模式。但是是的,你肯定应该测试一下。另一个建议是尝试确保所有文件修改都发生在同一个CPU上,以减轻污染。另外,当文件未映射时,不要忘记测量任何最终TLB分解的成本。您可以想象TLB条目的非暂时性提示,因此它们可能会很快被逐出,或者在从L1 DTLB逐出时只停留在L1 TLB中,而不是移动到L2 TLB。这类似于预取NTA只将数据带入L1,而不污染较大的L2。对于x86上的TLB条目,没有类似的机制,但这并不是因为不可能使用非时态的加载提示来执行任何操作。(不过,TLB条目缓存加载而不是存储这一点很好)。