在顺序修改驻留在Linux上的硬盘上的巨大(~65GB)内存映射文件时,我注意到以下行为:
因此,改变更少的东西实际上减少了通过量。该过程受到大量I / O限制(5%CPU时间为user
,95%CPU时间为iowait
),因此实际进行的处理无法解释吞吐量差异。我的猜测是内核分页系统在第一种情况下使用顺序写入,随后访问在后者中写入。由此导致的频繁搜索将解释性能差异。
如果我强制修改每个页面上的数据(例如,通过交换一些最低有效位),性能会提高到40MB / s级别,但这种方法会破坏数据。有效的NOOP,例如使用固定模式对页面上的数据进行两次XOR运算对性能没有影响(我使用objdump
来验证代码是否未被编译器消除)。我的猜测是双XOR完全在CPU缓存中处理,并且由于第二个XOR恢复原始数据,所以没有任何更改到达实际RAM,从而保持底层内存页面清洁。
那么有没有办法在第二种情况下提高吞吐量?具体来说,有没有办法让内核回写甚至选择干净的页面,或者以编程方式手动将页面标记为脏?