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

121

我应该使用哪些工具或技术来清除缓存文件内容,以避免影响性能结果? 我相信我需要完全清除或选择性地删除有关文件和目录内容的缓存信息。

我正在开发一款专业压缩实用程序,它需要读写操作系统最近未使用过且磁盘块不太可能被缓存的文件。

我希望消除在分析不同文件处理策略时看到的IO时间变异性。

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

我尝试了SysInternals CacheSet,但单击“清除”并不能导致在我刚刚多次读取的文件重新读取时的时间(恢复到冷启动后)有明显增加。


可能是如何使文件系统缓存失效?的重复问题。 - user541686
2
为什么这个问题被删除了?(http://meta.stackexchange.com/questions/186129/please-undelete-this-moderator-deleted-question-on-so) - Dan Dascalescu
9个回答

97

使用SysInternal的RAMMap应用程序

rammap empty standby

“Empty / Empty Standby List”菜单选项将清除Windows文件缓存。


2
RAMMap不支持Windows XP。这些菜单选项与SysInternals Cacheset应用程序中的“清除”按钮是否有所不同? - Stephen Denne
2
点击空闲待机列表后,按F5刷新文件列表。 - JoshG
“清空/清空待机列表”菜单选项将清除Windows文件缓存。您如何知道这一点?一个人如何将该菜单项与磁盘缓存联系起来? - Synetech
@smallest - 谢谢,这对我们尝试优化算法时测试磁盘性能非常有价值! - Jon Cage
3
如需编程方法,请参考此 Stack Overflow 帖子:https://dev59.com/6mEh5IYBdhLWcg3wNxLM#23085045 - snemarch
显示剩余2条评论

17
对于Windows XP,您应该能够通过使用FILE_FLAG_NO_BUFFERING选项打开文件并关闭句柄来清除特定文件的缓存。这并没有记录在文档中,我不知道它是否适用于Windows的后续版本,但是很久以前我在编写测试代码以比较文件压缩库时使用过这个技巧。我不记得读取或写入访问是否会影响此技巧。

在我的 Windows 7 SP1, x64 系统下完美运行。非常好的提示! - cxxl
2
那么这必须对于每个文件都要重复执行吗?例如,如果您复制了一个包含30个文件的目录,总共100MB分布在10个子目录中,您必须单独打开每个文件以确保读取实际磁盘而不是缓存吗? - Synetech
网站上的其他答案也证实了这在Win7和8上也可以工作。我认为它在Vista上也可以工作。是的,你必须在每个文件上运行它,但这并不需要很长时间。你只需要打开和关闭每个文件,当你关闭时,Windows会清除缓存。在你完成这些操作之后,再运行性能测试。 - Mooing Duck
1
这是一个完美的答案。编码简单,有效,并且应该适用于大多数Windows操作系统(包括XP,我只在Win7x64上进行了测试)。我使用读取权限和无共享打开文件。不确定哪种组合更重要。 - Rosco
在Linux(2.4.10及以上版本)上,可以使用open(2)系统调用中的O_DIRECT标志来实现类似的功能。更准确地说,据我所知,O_DIRECT并不清除该文件的缓存,而是尽力绕过它。 - kaiwan
这是对我有效的解决方案。使用FILE_FLAG_NO_BUFFERING作为倒数第二个参数调用CreateFile,然后立即关闭文件。之后使用常规的C++ API ifstream打开,由于没有缓存,速度现在明显变慢了。 - Markus

16

可以在此处找到一个命令行实用程序。

从源代码中:

EmptyStandbyList.exe是一个Windows命令行工具(适用于Vista及以上版本),可清空:

  • 进程工作集,
  • 修改的页面列表,
  • 待机列表(优先级0至7),或
  • 只有优先级0的待机列表。

用法:

EmptyStandbyList.exe workingsets|modifiedpagelist|standbylist|priority0standbylist

4
在所有嘈杂声中被高度低估的答案,这是一个简单实用的工具,只做一件事情并且做得很好。为了获得应有的点赞,你可能应该在答案中包含更多细节。 - Hashim Aziz
1
@HashimAziz,我同意!值得简短解释一下它可以清空的四个内容。例如,我只想摆脱磁盘读取缓存。我正在测试文件加载时间,如果最近加载了相同的文件,则性能会大幅提高,我们已经得出结论,这可能是由于Windows中的磁盘读取缓存(以及我如何到达这里)。这个实用程序看起来很棒,但现在我必须去研究这四个待机列表是什么,以及我想要清除哪一个。 - Bernd Wechner
1
我现在在我的测试中非常成功地使用它。谢谢。它的文档不是很好。我通过经验推断,如果没有参数,它只会清空所有四个提到的东西或至少8个待机列表之一。无论哪种方式,我在测试运行之间没有使用参数运行它,并且我已经看到了一个慢速加载、快速加载、快速加载变为慢速加载、慢速加载、慢速加载的周期。正如我所预期的那样,我很高兴。在这个测试的后续迭代中,我目睹了巨大的文件加载速度提升,没有任何解释,直到我们发现这可能是原因,并测试了这个实用程序并确认它有效! - Bernd Wechner
1
我会从Python测试脚本中运行它,这将在运行时弹出控制台。我很想找到一个本地的Python解决方案,但是还没有找到任何绑定。 - Bernd Wechner

14

快速搜索Linux可用的选项如下:

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

2
谢谢,看起来非常有用,不过我可能想要回显3而不是1。我主要关注的是Windows XP,这就是为什么我在搜索中没有找到它的原因。 - Stephen Denne
不幸的是,我可以使用的Linux环境内核版本为2.6.9。drop_caches 是在2.6.16内核中添加的。 - Stephen Denne
我阅读过很多其他帖子,建议您卸载并挂载文件系统以删除其中的所有缓存项,我认为在2.6.16之前以及在更近期的内核中都是如此。 - TafT

4
 #include <fcntl.h>

int posix_fadvise(int fd, off_t offset, off_t len, int advice);

使用建议选项POSIX_FADV_DONTNEED:
指定的数据在不久的将来不会被访问。


仅适用于Linux和其他posix,不适用于Windows:http://stackoverflow.com/questions/29752064/what-is-posix-fadviseposix-fadv-dontneed-equivalent-on-windows https://dev59.com/_nM_5IYBdhLWcg3w2XBg - osgx

3
我发现一种技术(除了重新启动以外)似乎有效:
  1. 运行几个MemAlloc的副本
  2. 对于每一个副本,分配大块内存几次
  3. 使用Process Explorer观察系统缓存大小减少到非常低的水平
  4. 退出MemAlloc程序
它并不是有选择性的。理想情况下,我希望能够清除用于缓存我不再需要缓存的文件磁盘块的特定内存部分。

那会导致将东西推入页面文件,这会在之后相当长一段时间内降低性能。如果你打算采取某些临时手段,那么你最好读取一些其他大文件;至少这只会清除磁盘缓存,而不会影响其他方面。 - Synetech

3

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

你会发现,尽管Sysinternals Cacheset会减少“Cache WS Min”,但实际数据仍以待用列表的形式存在,直到被替换为止。要替换它,请使用诸如MemAllocflushmem by Chad AustinWindows Server 2003 Resource Kit Tools中的Consume.exe等工具。

0

由于问题还涉及到Linux,这里有一个相关的答案在这里

命令行工具vmtouch允许添加和删除文件和目录到系统文件缓存中,以及其他一些功能。


0

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