禁用内存缓存 - 真正的原因

好的,在你标记我的帖子为重复之前,我想说,我知道一个非常好的答案:如何清除或禁用内存缓存?
但这对我来说不适用。

我正在进行一些内存应用和使用磁盘的应用之间的性能测试。因此,我希望能够确保每次应用程序尝试从磁盘中获取数据时,系统确实从磁盘中获取数据,而不是从内存缓存中获取数据。(我想要一个性能因素,即当应用程序必须从磁盘读取时,它的操作变得多么糟糕。)
我知道可以通过 sync && echo 3 > /proc/sys/vm/drop_caches 命令清除缓存,但是每分钟用cron清理一次对我来说太慢了,因为缓存很快又被填满了。

所以我有一个问题:你真的无法禁用这个功能吗?或者有没有什么变通方法?它真的会破坏我的测试结果。

附注:我使用的是 Ubuntu 12.04 64位。


这些答案对您有帮助吗?http://unix.stackexchange.com/questions/87863/are-there-any-ways-or-tools-to-dump-the-memory-cache-and-buffer http://askubuntu.com/questions/147978/how-can-i-dump-all-physical-memory-to-a-file - LiveWireBT
我认为这些是针对不同问题的答案... - Michał Herman
我真的认为一般情况下是不可能的。也许有一些mmap()的魔法可以使映射到磁盘的地图变得易失性,从而强制每次重写/重新读取,但我怀疑缓存文件系统内容与基本内存管理器紧密相关,无法避免它。我可能错了---等着看吧。 - Rmano
1个回答

您可以使用hdparm禁用它,打开文本编辑器,编辑/etc/hdparm.conf文件,取消注释"write_cache = off"行。重新启动后,输入sudo hdparm -i /dev/sdX(使用您的驱动器字母),并检查AdvancedPM行,最后显示写缓存的状态。
编辑:您可以通过运行hdparm -i /dev/sdX来检查更改前的write_cache选项。
编辑2:在挂载分区时使用"-o sync"参数以避免写入缓存,关于读取部分我不清楚。

这将禁用磁盘的内部缓存。Linux将继续愉快地在主内存中缓存文件系统数据... - Rmano
1你可以尝试使用-o sync参数挂载驱动器吗?据说它可以关闭写缓存。 - fpinto
是的,-o sync 对于写入操作来说是个好主意。但我怀疑它是否能阻止读取缓存块...(请更新答案) - Rmano