在顺序修改Linux上一个巨大的(〜65GB)内存映射文件时,我注意到了以下行为:
所以减less事物的数量实际上减less了通过量。 该过程是大量的I / O限制(5%的CPU时间是user
,95%的CPU时间是iowait
),所以实际的处理发生不能解决吞吐量的差异。 我的猜测是,内核分页系统在第一种情况下使用顺序写入,随机写入在后者中写入。 由此产生的频繁寻求会考虑到性能差异。
如果我强制修改每个页面上的数据(例如通过交换一些最低有效位),性能会提高到40MB / s的水平,但这种方法会破坏数据。 有效的NOOP(例如,使用固定模式对页面上的数据进行两次XOR操作对性能没有影响(我使用objdump
来validation代码没有被编译器清除)。 我的猜测是,双XOR完全在CPUcaching内处理,而第二个XOR恢复原始数据,所以没有任何变化到达实际的RAM,从而保持底层内存页面的清洁。
那么有没有办法在第二种情况下提高吞吐量? 具体来说,有没有办法使内核回写甚至select干净的页面,或强有力的手动标记页面为脏编程?