【问题标题】:Disabling disk cache in linux在linux中禁用磁盘缓存
【发布时间】:2013-11-26 11:13:12
【问题描述】:

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

目前我使用的是 Ubuntu 12.04,我该怎么做?

谢谢。

【问题讨论】:

  • 如果你在一个单独的分区上工作,你可以用-o sync挂载它

标签: c linux caching ubuntu-12.04


【解决方案1】:

您需要 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 hdparm, man system

【讨论】:

  • 你也可以从shell运行命令,不用system():sudo hdparm -W 0 /dev/sda1
  • 注意:这只会禁用写缓存。读缓存怎么样?
  • @AaronDigulla,也许这就是 hdparm 的“-f”选项的用途:“在退出时同步并刷新设备的缓冲区缓存。”还有一个“-F”选项可以“刷新驱动器上的写入缓存缓冲区”; “-F”对“写入”的强调表明“-f”会刷新读写缓存。
【解决方案2】:

echo 100 &gt; /proc/sys/vm/dirty_expire_centisecs

echo 100 &gt; /proc/sys/vm/dirty_writeback_centisecs

从 RAM 到磁盘的刷新时间减少到 1 秒

你可以用 0 测试

或:

echo 1 &gt; /proc/sys/vm/drop_caches

将所有 RAM 刷新到磁盘

【讨论】:

  • 您确定最终命令实际上是刷新缓存而不是丢弃它吗?我在很多地方读到,如果不先使用sync,这是一个有风险的操作。
  • @d33tah 我很确定丢弃缓存只会丢弃干净缓存而不是脏缓存。
  • @user267092 如 Linux 内核文档 (kernel.org/doc/Documentation/sysctl/vm.txt) 中所述,该操作没有破坏性。
【解决方案3】:

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

  • 在硬盘本身上缓存
  • I/O 硬件子系统中的缓存
  • 虚拟文件系统中的缓存
  • CPU 中的多级缓存

所以问题是您要测试什么以及要为此禁用哪些缓存。

【讨论】:

  • OP 中提到的高清缓存。
  • VFS 缓存通常也会在其中发挥作用。而且由于它在内存中,如果数据不是太大,就会涉及 CPU 缓存(好吧,对于 i7,L3 缓存高达 15 MB,因此“大”变得相当大)。
  • @canoe 最初的问题只说“禁用磁盘缓存”。它可以表示任何内部驱动器缓存、控制器缓存、VFS 缓存或libc 缓冲。对于学校任务,我希望老师的真正意思是libc 级别缓冲。
猜你喜欢
  • 1970-01-01
  • 2013-02-22
  • 2012-03-22
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 2015-10-01
  • 1970-01-01
  • 2015-05-22
相关资源
最近更新 更多