2013-08-21 24 views
4

我试图理解具有2.6和3.0内核的服务器上的dirty_expire_centisecs参数的行为。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()的每秒速率和大小。

+0

有没有人有任何意见。至少证实或拒绝我的观察? – Harshana

+0

我在Ubuntu kernel 3.5.0-23-generic上观察到了与dirty_expire_centisecs相同的行为。我同意你的看法,似乎很无用。我还没有用dirty_background_bytes进行试验。通常,我将dirty_background_ratio设置为50%,但它不相关,因为dirty_expire计时器总是在它到达之前跳过。 – hyc

+0

我正在观察脏页面在达到dirty_background_bytes和dirty_bytes值之前刷新的行为。任何人都可以为什么会发生这种情况,是否有其他人观察过这种行为? –

回答

5

我在linux-kernel邮件列表上问了这个问题,并从Jan Kara那里得到了答案。到期时间戳是基于文件inode的modtime。因此,当到期时间发生时,同一文件中的多个页面将被全部写入,因为它们全都与相同的inode相关联。

http://lkml.indiana.edu/hypermail/linux/kernel/1309.1/01585.html

+0

谢谢hyc。这完全解释了为什么它的行为方式。 – Harshana