在Linux中禁用磁盘缓存

11

在我的课程项目中,老师让我们进行一些代码评估(使用C语言),为此我们需要在测试期间禁用磁盘缓存。

目前我正在使用Ubuntu 12.04,我该如何做到这一点?

谢谢。


如果您正在使用单独的分区进行工作,您可以使用“-o sync”挂载该分区。 - Rolf
3个回答

21

您需要root访问权限才能执行此操作。您可以运行hdparm -W 0 /dev/sda命令来禁用写缓存,其中您需要将/dev/sda替换为您的驱动器设备:

#include <stdlib.h>
...
system("hdparm -W 0 /dev/sda1");

您还可以像这样对单个分区选择性地禁用写缓存:hdparm -W 0 /dev/sda1

要重新启用缓存,只需使用-W 1参数即可。

man hdparmman system


4
您也可以在终端中运行该命令,而不是使用“system()”函数:sudo hdparm -W 0 /dev/sda1 - Aaron Digulla
11
请注意:这只禁用了写缓存。那么读取缓存呢? - Aaron Digulla
3
也许这就是hdparm的“-f”选项的作用:“同步并在退出时刷新设备的缓存”。还有一个“-F”选项可以“刷新驱动器写缓存缓冲区”;强调“写”的“-F”建议“-f”会刷新读写缓存。 - PointedEars

6

echo 100 > /proc/sys/vm/dirty_expire_centisecs

echo 100 > /proc/sys/vm/dirty_writeback_centisecs

这将把从RAM到磁盘的刷新时间减少到1秒。

您可以使用0进行测试。

或者:

echo 1 > /proc/sys/vm/drop_caches

将所有RAM刷新到磁盘。


1
你确定最终的命令确实清除了缓存而不是仅仅丢弃它吗?我在很多地方读到过,如果没有先使用“sync”,这是一项风险操作。 - d33tah
@d33tah 我相信 drop cache 只会清除干净的缓存而不是脏缓存。 - user267092
1
根据Linux内核文档(https://www.kernel.org/doc/Documentation/sysctl/vm.txt)中的规定,该操作不会破坏数据。 - Keeley Hoek

0

我认为你需要告诉你的老师现在已经不是1984年了。现代计算机系统有数十个缓存,没有好的方法可以将它们全部禁用:

  • 硬盘本身的缓存
  • 输入/输出硬件子系统中的缓存
  • 虚拟文件系统中的缓存
  • 处理器内部的几层缓存

因此问题是你想要测试什么以及你想要禁用哪些缓存。


12
OP中提到的HD缓存。 - canoe
1
VFS缓存通常也在其中发挥作用。由于它在内存中,如果数据不太大(i7的L3缓存高达15 MB,因此“大”已经变得相当大),CPU缓存也会参与其中。 - Aaron Digulla
@canoe 原问题只是说“禁用磁盘缓存”。它可以意味着任何内部驱动器缓存、控制器缓存、VFS缓存或libc 缓冲。对于学校任务,我希望老师的真正意思是 libc 级别的缓冲。 - Mikko Rantalainen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接