避免在使用mmap()时污染翻译后查找缓存(TLB)。

4
当我们想要写入数据项时,包含数据的块首先被带入缓存,然后数据项被写入到缓存中。这可能会导致缓存污染。为了避免这种情况,英特尔引入了无时间指令。
如果我将使用mmap()将数据写入文件,并且永远不再读取,是否有可能避免为此创建TLB条目?是否有类似于非时间指令的指令可用?

1
不,我非常确定没有,因为您无法将hugepages用于文件支持的映射。使用write并设置缓冲区大小为大约1/2 L2缓存大小或类似大小可能会实际表现更好;您应该进行测试。(虽然内核在将您的缓冲区复制到页面高速缓存时可能不会使用NT存储)。如果文件数据确实不会在很长一段时间内被引用,则可以使用madvise(MADV_DONTNEED)来避免页面高速缓存污染,以鼓励内核在将其写入磁盘后将其从RAM中删除。 - Peter Cordes
2
根据您的访问模式,pwrite() 可能比 write() 更合适。但是,是的,您一定要进行测试。另一个建议是尝试确保所有文件修改都发生在同一个 CPU 上,以减轻污染。还要记得测量在取消映射文件时任何最终 TLB shootdown 的成本。 - Pseudonym
1个回答

2
TLB条目是CPU用来将虚拟地址映射到物理地址的必要组成部分,因此无法通过mmap()或任何类似的API避免它们。
即使有可能避免在TLB中存储映射,每次访问映射内存都需要重新加载相应的页表条目,因此性能会大大降低。非临时访问仅对存储操作有意义,但页表条目是读取操作。

1
你可以想象一种用于TLB条目的非时态提示,这样它们可能会更快地被驱逐,或者永远只停留在L1 TLB中,而不是从L1 DTLB驱逐后移动到L2 TLB。这类似于PREFETCHNTA仅将数据带入L1,而不会污染更大的L2。在x86上,没有TLB条目的任何类似机制,但并非因为对于加载而言无法使用非时态提示。(虽然值得注意的是,TLB条目缓存的是加载,而不是存储)。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接