清除文件缓存以重复进行性能测试


106

我可以使用哪些工具或技术来删除缓存的文件内容,以防止性能结果出现偏差?我相信我需要完全清除或有选择地删除有关文件和目录内容的缓存信息。

我正在开发的应用程序是一个专用的压缩实用程序,预计将进行大量工作,以读取和写入操作系统最近未触及的,不太可能缓存其磁盘块的文件。

我希望消除重复执行分析不同策略以执行文件处理工作的任务时在IO时间中看到的可变性。

我主要对Windows XP的解决方案感兴趣,因为这是我的主要开发机器,但是我也可以使用linux进行测试,因此也对针对该环境的答案感兴趣。

我尝试了SysInternals CacheSet,但是单击“清除”不会导致重新读取我刚刚读过几次的文件的时间增加(在冷启动后恢复计时)。



1
为什么删除此问题?
Dan Dascalescu 2015年

Answers:


82

使用SysInternalRAMMap应用程序

rammap空待机

“清空/清空待机列表”菜单选项将清除Windows文件缓存。


2
RAMMap无法在Windows XP上运行。这些菜单选项是否与SysInternals Cacheset应用程序中的“清除”按钮有所不同?
Stephen Denne 2012年

@stephen这项技术在Windows 8下非常适合我!Windows XP现在已有12年历史了,是否有任何原因不能在Vista,Windows 7或Windows 8上尝试呢?
杰夫·阿特伍德

@Jeff我不再使用这些限制。那么,“空备用列表”会导致需要磁盘IO的最近读取文件的下一次读取?
史蒂芬·丹尼

2
单击空的备用列表后,按F5刷新文件列表
JoshG 2013年

3
有关编程方法,请参见以下SO帖子:stackoverflow.com/a/23085045/430360
2015年

16

对于Windows XP,您应该能够通过使用带有FILE_FLAG_NO_BUFFERING选项的CreateFile打开文件,然后关闭句柄来清除特定文件的缓存。这没有记录,我也不知道它是否可以在更高版本的Windows上运行,但是我在编写测试代码以比较文件压缩库时使用了很久。我不记得读写访问是否影响了这个技巧。


在Windows 7 SP1,x64下,对我来说效果很好。大提示!
cxxl 2012年

2
因此,必须对每个文件重复此操作吗?因此,例如,如果您复制一个包含100MB的目录,该目录分布在10个子目录中的30个文件中,则必须分别打开每个目录以确保您读取了实际的磁盘而不是高速缓存吗?
Synetech 2013年

该网站上的其他答案也确认这同样适用于Win7和8。我认为它可以在Vista上运行。是的,您必须在每个文件上运行它,但是并不需要花费那么长时间。您需要做的就是打开和关闭每个文件,然后在关闭时Windows清除缓存。完成此操作后,然后运行性能测试。
Mooing Duck

1
这是一个完美的答案。易于编写代码,有效且可以在大多数Windows操作系统(包括XP,我仅在Win7x64上进行过测试)上运行。我以读取权限打开了文件,没有共享。不确定什么组合很重要。
罗斯科2014年

在open(2)syscall中具有O_DIRECT标志的Linux(自2.4.10起)上具有类似功能。好吧,更准确地说,据我了解,O_DIRECT不会清除该文件的缓存,而是尝试最好绕过它。
kaiwan 2015年

14

快速谷歌搜索为Linux提供了这些选项

  1. 卸载并挂载包含文件的分区
  2. sync && echo 1 > /proc/sys/vm/drop_caches

2
谢谢,这看起来很有用,尽管我可能想回显3而不是1。我主要对Windows XP感兴趣,这就是为什么我在谷歌搜索中没有发现它的原因。
Stephen Denne

不幸的是,我可以在其中使用的Linux环境的内核版本为2.6.9。在内核2.6.16中添加了drop_caches
Stephen Denne,2009年

我读过的许多其他文章都建议您可以卸载并挂载文件系统以删除所有受累的项目,我认为在2.6.16之前以及更新的内核中都是如此。
TafT 2011年

12

命令行实用程序可以在这里找到

从来源:

EmptyStandbyList.exe 是Windows(Vista及更高版本)的命令行工具,可以清空:

  • 处理工作集,
  • 修改后的页面列表,
  • 备用列表(优先级0到7),或
  • 仅优先级为0的备用列表。

用法:

EmptyStandbyList.exe workingsets|modifiedpagelist|standbylist|priority0standbylist

3
在所有杂乱无章的简单实用程序中,它被低估了,它只能完成一项工作并做好。您可能应该在答案中包含更多详细信息,以获取应得的评价。
Prometheus


3

我发现一种似乎有效的技术(除了重新启动之外):

  1. 运行一些MemAlloc
  2. 每次分配几次大块内存
  3. 使用Process Explorer观察系统缓存大小减少到非常低的水平
  4. 退出MemAlloc程序

它不是选择性的。理想情况下,我希望能够清除内存中用于缓存我不想再缓存的文件磁盘块的特定部分。


这样做的副作用是将内容推入页面文件中,这将在相当长的一段时间后降低性能。如果您打算使用kludge,那么您还可以阅读其他一些大文件;至少这只会清除磁盘缓存,而不会清除其他任何内容。
Synetech 2013年

3

要更好地查看Windows XP文件系统缓存-尝试使用Tim Murgent的ATM-它使您可以在更详细和准确的视图中查看文件系统缓存工作集大小和备用列表大小。对于Windows XP-您需要ATM的旧版本1,该版本可在此处下载因为V2V3需要Server 2003,Vista或更高版本。

您将观察到,尽管Sysinternals Cacheset会减少“ Cache WS Min”-实际数据仍然以备用列表的形式继续存在,从那里可以使用它,直到被其他东西替换为止。为了然后用东西取代它使用别的如工具MemAllocflushmem乍得奥斯汀从或Consume.exe 的Windows Server 2003 Resource Kit工具


0

因为这个问题也问为Linux,有一个相关的答案在这里

命令行工具vmtouch允许在系统文件缓存中添加和删除文件和目录等。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.