在最近的Linux内核上测试msync的使用有什么好方法?

use*_*336 6 c linux kernel mmap

我在Linux 2.6上的应用程序中使用msync来确保崩溃时的一致性.我需要彻底测试我对msync的使用,但实现似乎正在为我刷新所有相关页面.有没有办法阻止mmap的页面自动刷新到磁盘上,以暴露我的错误使用msync?

Nem*_*emo 7

向@samold道歉,"swappiness"与此毫无关系.Swappiness只影响内核交换掉脏脏匿名页面与内存不足时驱逐页面缓存页面的方式.

您需要使用控制pdflush任务Linux VM可调参数.对于初学者,我建议:

sysctl -w vm.dirty_writeback_centisecs=360000
Run Code Online (Sandbox Code Playgroud)

默认情况下,vm.dirty_writeback_centisecs为3000,这意味着内核会将超过30秒的任何脏页面视为"太旧"并尝试将其刷新到磁盘.通过将其启动最多1小时,您应该能够避免将脏页面冲到磁盘上,至少在短暂的测试期间是这样.除了...

sysctl -w vm.dirty_background_ratio=80
Run Code Online (Sandbox Code Playgroud)

默认情况下,vm.dirty_background_ratio为10,如10%.这意味着当脏页面占用超过10%的物理内存时,内核会认为它需要忙于将某些东西刷新到磁盘上,即使它比它更年轻dirty_writeback_centisecs.将此文件加到80或90,内核应该愿意容忍脏页占用的大部分RAM.(不过,我不会设置太高,因为我打赌没有人会这样做,这可能会引发奇怪的行为.)除了......

sysctl -w vm.dirty_ratio=90
Run Code Online (Sandbox Code Playgroud)

默认情况下,vm.dirty_ratio为40,这意味着一旦40%的RAM是脏页,尝试创建更多脏页的进程将阻塞,直到某些内容被驱逐.总是让这个大于dirty_background_ratio.嗯,来想一想,在那个之前设置这个,只是为了确保这个总是更大.

这是我最初的建议.无论如何,你的内核可能会开始驱逐页面; Linux VM是一个神秘的野兽,似乎在每个版本都进行了调整.希望这提供了一个起点.

有关VM可调参数的完整列表,请参阅内核源中的Documentation/sysctl/vm.txt.(最好参考您实际使用的内核版本的文档.)

最后,使用/ proc/PID/pagemap界面随时查看哪些页面实际上是脏的.