手动将内存页面标记为“脏”'

时间:2015-02-11 15:32:39

标签: c++ linux paging mmap throughput

在顺序修改驻留在Linux上的硬盘上的巨大(~65GB)内存映射文件时,我注意到以下行为:

  • 如果我修改文件中的几乎所有内容(我猜每个内存页面至少有一个字节),读/写吞吐量大约为40MB / s
  • 如果我只修改了一些页面,而其他页面保持不变,则读/写输出显着降低,大​​约为7MB / s

因此,改变更少的东西实际上减少了通过量。该过程受到大量I / O限制(5%CPU时间为user,95%CPU时间为iowait),因此实际进行的处理无法解释吞吐量差异。我的猜测是内核分页系统在第一种情况下使用顺序写入,随后访问在后者中写入。由此导致的频繁搜索将解释性能差异。

如果我强制修改每个页面上的数据(例如,通过交换一些最低有效位),性能会提高到40MB / s级别,但这种方法会破坏数据。有效的NOOP,例如使用固定模式对页面上的数据进行两次XOR运算对性能没有影响(我使用objdump来验证代码是否未被编译器消除)。我的猜测是双XOR完全在CPU缓存中处理,并且由于第二个XOR恢复原始数据,所以没有任何更改到达实际RAM,从而保持底层内存页面清洁。

那么有没有办法在第二种情况下提高吞吐量?具体来说,有没有办法让内核回写甚至选择干净的页面,或者以编程方式手动将页面标记为脏?

0 个答案:

没有答案