【问题标题】:Avoiding Translation Look aside buffer ( TLB ) pollution when mmap()在 mmap() 时避免翻译查看缓冲区 (TLB) 污染
【发布时间】:2016-12-05 22:58:10
【问题描述】:

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

如果我要使用 mmap() 将数据写入文件并且不再读取,是否可以避免为此创建 TLB 条目?有没有类似非临时指令的指令可用?

【问题讨论】:

  • 不,我很确定没有,因为您不能将大页面用于文件支持的映射。将write 与可能是 1/2 L2 缓存大小或类似大小的缓冲区一起使用可能实际上性能更好;你应该测试。 (虽然内核可能在将缓冲区复制到页面缓存时不会使用 NT 存储)。如果文件数据真的长时间不会被引用,您可以避免页面缓存污染,方法是使用madvise(MADV_DONTNEED) 鼓励内核在将其写入磁盘后将其从 RAM 中删除。
  • pwrite() 可能比 write() 更合适,具体取决于您的访问模式。但是,是的,您绝对应该进行测试。另一个建议是尝试确保所有文件修改都发生在同一个 CPU 上以减轻污染。当文件未映射时,不要忘记测量任何最终 TLB 击落的成本。

标签: linux-kernel x86 intel micro-optimization tlb


【解决方案1】:

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

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

【讨论】:

  • 您可以想象 TLB 条目的非临时提示,因此它们可能会很快被驱逐,或者在从 L1 DTLB 驱逐时只停留在 L1 TLB 中而不是移动到 L2 TLB。这类似于 PREFETCHNTA 仅将数据带入 L1,而不会污染较大的 L2。对于 x86 上的 TLB 条目,没有这样的机制,但不是因为不可能对负载进行非临时提示。 (不过,TLB 条目缓存加载,而不是存储,这很好。
猜你喜欢
  • 2012-02-18
  • 2016-10-20
  • 2013-05-13
  • 2010-10-25
  • 2016-05-04
  • 1970-01-01
  • 2014-03-20
  • 2011-05-14
  • 1970-01-01
相关资源
最近更新 更多