我试图了解具有2.6和3.0内核的服务器上dirty_expire_centisecs参数的行为.
内核文档说(vm.txt / dirty_expire_centisecs)
“下次刷新线程唤醒时,将记录内存中脏的时间超过此间隔的数据.”
这意味着,不会写入内存中短于此间隔的脏数据.
根据我的测试,dirty_expire_centisecs的行为如下:当回写计时器在到期计时器之前触发时,不会刷新任何页面,否则将刷新所有页面.
如果达到background_bytes限制,则根据速率刷新全部或部分,与两个计时器无关.
我的测试告诉我低写入速率(每秒小于1MB),dirty_background_bytes触发器将刷新所有脏页并以稍高的数据速率(高于每秒2MB),它只刷新一部分脏数据,而不是到期值.
这与vm.txt中的内容不同.不刷新最新数据是有意义的.对我来说,观察到的行为不符合逻辑,实际上毫无用处.你们有什么感想 ?
我的测试设置:
具有16GB RAM的服务器运行Suse 11 SP1,SP2和RedHat 6.2(多重启动设置)
vm.dirty_bytes = 50000000 // 50MB <br> vm.dirty_background_bytes = 30000000 // 30MB <br> vm.dirty_writeback_centisecs = 1000 // 10 seconds <br> vm.dirty_expire_centisecs = 1500 // 15 seconds <br>
使用文件写入工具,我可以控制write()的每秒速率和大小.
解决方法
我在linux-kernel邮件列表上问了这个问题,得到了Jan Kara的回答.到期时间的时间戳是文件inode的modtime.因此,当到期时间发生时,将在同一文件中弄脏的多个页面都被写入,因为它们都与相同的inode相关联.
http://lkml.indiana.edu/hypermail/linux/kernel/1309.1/01585.html