113

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

我正在开发的应用程序是一个专门的压缩实用程序,预计会做很多工作来读写操作系统最近没有接触过的文件,并且这些文件的磁盘块不太可能被缓存。

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

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

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

4

9 回答 9

92

使用 SysInternal 的RAMMap 应用程序

rammap 空待机

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

于 2012-03-10T19:22:00.737 回答
17

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

于 2011-08-18T19:40:11.170 回答
14

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

  1. 卸载并挂载保存文件的分区
  2. sync && echo 1 > /proc/sys/vm/drop_caches
于 2009-01-25T21:41:16.530 回答
14

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

来源:

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

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

用法:

EmptyStandbyList.exe workingsets|modifiedpagelist|standbylist|priority0standbylist
于 2017-03-22T09:11:32.543 回答
4
 #include <fcntl.h>

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

带有通知选项POSIX_FADV_DONTNEED
指定的数据在不久的将来不会被访问。

于 2012-11-07T03:12:08.320 回答
3

我发现了一种似乎可行的技术(除了重新启动):

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

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

于 2009-01-26T01:17:41.743 回答
3

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

您会观察到,尽管Sysinternals Cacheset会减少“Cache WS Min” - 实际数据仍然以备用列表的形式继续存在,从那里可以使用它,直到它被其他东西替换。然后使用其他工具替换它,例如Chad Austin的MemAlloc或flushmem 或Windows Server 2003 Resource Kit Tools中的 Consume.exe 。

于 2012-11-20T18:51:44.493 回答
0

由于该问题也针对 Linux 提出,因此这里有一个相关的答案。

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

于 2017-06-14T12:10:45.720 回答
0

有一个 Windows API 调用https://docs.microsoft.com/en-us/windows/desktop/api/memoryapi/nf-memoryapi-setsystemfilecachesize可用于刷新文件系统缓存。它还可以用于将缓存大小限制为非常小的值。看起来非常适合这些类型的测试。

于 2019-05-20T09:25:41.217 回答