Linux kernel 脏_过期_厘米秒的实现

Linux kernel 脏_过期_厘米秒的实现,linux-kernel,Linux Kernel,我试图了解内核为2.6和3.0的服务器上dirty_expire_centisecs参数的行为 内核文档说明(vm.txt/dirty\u expire\u centisecs) “下次刷新器线程唤醒时,将写出内存中脏数据超过此时间间隔的数据。” 这意味着,内存中的脏数据在短于此时间间隔的情况下将不会被写入 根据我的测试,dirty_expire_centisecs的行为如下:当写回计时器在过期计时器之前触发时,将不会刷新任何页面,否则将刷新所有页面。 如果达到后台_字节限制,它将根据速率刷新全

我试图了解内核为2.6和3.0的服务器上dirty_expire_centisecs参数的行为

内核文档说明(vm.txt/dirty\u expire\u centisecs) “下次刷新器线程唤醒时,将写出内存中脏数据超过此时间间隔的数据。”

这意味着,内存中的脏数据在短于此时间间隔的情况下将不会被写入

根据我的测试,dirty_expire_centisecs的行为如下:当写回计时器在过期计时器之前触发时,将不会刷新任何页面,否则将刷新所有页面。 如果达到后台_字节限制,它将根据速率刷新全部或部分,与两个计时器无关

我的测试告诉我,在低写入速率(低于1MB/秒)下,脏字节触发器将刷新所有脏页,而在稍高的数据速率(高于2MB/秒)下,它只刷新脏数据的一部分,与过期值无关

这与vm.txt中所说的不同。不刷新最新数据是有道理的。对我来说,观察到的行为不是合乎逻辑的,实际上是无用的。你们觉得怎么样

我的测试设置: 运行Suse 11 SP1、SP2和RedHat 6.2(多引导设置)的16GB RAM服务器

vm.dirty_字节=50000000//50MB
vm.dirty_background_字节=30000000//30MB
vm.dirty\u writeback\u centisecs=1000//10秒
vm.dirty\u expire\u厘秒=1500//15秒

通过一个文件写入工具,我可以控制write()的每秒速率和大小。

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


有人有什么意见吗。至少是确认还是拒绝我的观察结果?我在Ubuntu内核3.5.0-23-generic上观察到了脏_过期_厘米秒的相同行为。我同意你的看法,这似乎毫无用处。我还没有尝试过脏字节。通常,我会将脏页背景值比率设置为50%,但这与此无关,因为脏页过期计时器总是在到达之前触发。我观察到脏页在达到脏页背景值和脏页字节值之前刷新的行为。有人知道为什么会发生这种情况吗?有人观察到过这种行为吗?我在ext3和ext4上看到过这种情况,因为它们的commit=xx mount选项。基本上,ext3/ext4具有每个文件系统的刷新计时器,它完全独立于/proc/sys/vm设置。我发现没有办法禁用它,并使它尊重系统设置。谢谢hyc。这很好地解释了为什么它的行为方式。
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>