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

在顺序修改Linux上一个巨大的(〜65GB)内存映射文件时,我注意到了以下行为:

  • 如果我修改了文件中的几乎所有内容(我猜每个内存页面至less有一个字节),读/写吞吐量约为40MB / s
  • 如果我只修改了一些页面而不改变其他的页面,那么读/写吞吐量就会大大降低 ,达到大约7MB / s

所以减less事物的数量实际上减less了通过量。 该过程是大量的I / O限制(5%的CPU时间是user ,95%的CPU时间是iowait ),所以实际的处理发生不能解决吞吐量的差异。 我的猜测是,内核分页系统在第一种情况下使用顺序写入,随机写入在后者中写入。 由此产生的频繁寻求会考虑到性能差异。

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

那么有没有办法在第二种情况下提高吞吐量? 具体来说,有没有办法使内核回写甚至select干净的页面,或强有力的手动标记页面为脏编程?