【发布时间】: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