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

Posted

技术标签:

【中文标题】清除文件缓存以重复性能测试【英文标题】:Clear file cache to repeat performance testing 【发布时间】:2010-10-03 11:05:42 【问题描述】:

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

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

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

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

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

【问题讨论】:

How to invalidate the file system cache?的可能重复 为什么是deleted这个问题? 【参考方案1】:

使用 SysInternal 的RAMMap app。

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

【讨论】:

RAMMap 不能在 Windows XP 上运行。这些菜单选项与 SysInternals Cacheset 应用程序中的“清除”按钮有什么不同吗? @stephen 这项技术在 Windows 8 下非常适合我! Windows XP 已经 12 岁了,有什么理由不能在 Vista、Windows 7 或 Windows 8 上试用它? @Jeff 我不再使用这些限制。那么“Empty Standby List”会导致下一次读取需要磁盘 IO 的最近读取的文件? 点击空白待机列表后按F5刷新文件列表 有关程序化方法,请参阅此 SO 帖子:***.com/a/23085045/430360【参考方案2】:

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

【讨论】:

在 Windows 7 SP1、x64 下非常适合我。很棒的提示! 所以必须为每个文件重复?因此,例如,如果您复制一个包含 100MB 的目录,分布在 10 个子目录中的 30 个文件中,则必须分别打开每个文件以确保读取的是实际磁盘而不是缓存? 网站上的其他答案确认这也适用于 Win7 和 8。我认为它适用于vista。是的,您必须在每个文件上运行它,但这并不需要那么长时间。您需要做的就是打开和关闭每个文件,当您关闭时,Windows 会清除缓存。完成此操作后,然后运行性能测试。 这是一个完美的答案。代码简单、有效,并且应该可以在大多数 Windows 操作系统上运行(包括 XP,我只在 Win7x64 上测试过)。我以读取权限打开文件,没有共享。不知道什么组合很重要。 Linux(2.4.10 及更高版本)上的类似功能与 open(2) 系统调用中的 O_DIRECT 标志。好吧,更准确地说,据我了解,O_DIRECT 不会清除该文件的缓存,它会尽量绕过它。【参考方案3】:

可以在here找到一个命令行实用程序

来源:

EmptyStandbyList.exe 是 Windows 的命令行工具(Vista 和 以上)可以为空:

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

用法:

EmptyStandbyList.exe workingsets|modifiedpagelist|standbylist|priority0standbylist

【讨论】:

在所有噪音中被高度低估的答案,简单的实用程序可以完成一项工作并且做得很好。您可能应该在答案中包含更多详细信息,以获得您应得的支持。 @HashimAziz,我同意!值得简短解释一下它可以清空的这四件事是什么。例如,我只想摆脱磁盘读取缓存。如果我最近加载了同一个文件,我正在测试文件加载时间并获得巨大的性能提升,我们得出的结论可能是因为 Windows 中的磁盘读取缓存(以及我如何登陆这里)。这个实用程序看起来很棒,但现在我必须去研究这 4 个备用列表是什么以及我想清除哪个。 我现在在我的测试中使用这个效果很好。谢谢。它没有很好的记录。我凭经验推断,如果没有参数,它只会清空所有提到的四个东西或至少 8 个备用列表。无论哪种方式,我在测试运行之间没有参数地运行它,并且我看到了一个慢加载、快加载、快加载变为慢加载、慢加载、慢加载的循环。正如我所期待的那样,我很高兴。我目睹了该测试的后续迭代中文件加载速度的巨大提升,没有任何解释,直到我们发现这可能是原因,并测试了该实用程序并确认它有效! 我进一步从 Python 测试脚本运行它。它在运行时会弹出一个控制台。很想找到一个原生 Python 解决方案,但还没有找到任何绑定。【参考方案4】:

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

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

【讨论】:

谢谢,这看起来非常有用,尽管我可能想回显 3 而不是 1。我主要对 Windows XP 感兴趣,这就是为什么我在谷歌搜索中没有找到它的原因。 不幸的是,我可以在其中使用它的 linux 环境具有内核版本 2.6.9。内核 2.6.16 中添加了 drop_caches 我读过的许多其他帖子建议您可以卸载并挂载文件系统以删除它的所有 chached 项目,我认为在 2.6.16 之前以及最近的情况下都是如此内核。【参考方案5】:
 #include <fcntl.h>

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

带有建议选项POSIX_FADV_DONTNEED: 近期将不会访问指定的数据。

【讨论】:

仅适用于 Linux 和其他 posix,不适用于 Windows:***.com/questions/29752064/…***.com/questions/1201168/…【参考方案6】:

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

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

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

【讨论】:

这有将东西推入页面文件的副作用,这会在之后的很长一段时间内降低性能。如果您打算求助于kludge,那么您不妨阅读其他一些大文件;至少这只会清除磁盘缓存而不是其他任何东西。【参考方案7】:

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

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

【讨论】:

【参考方案8】:

由于Linux也问过这个问题,所以有一个相关的答案here。

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

【讨论】:

【参考方案9】:

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

【讨论】:

以上是关于清除文件缓存以重复性能测试的主要内容,如果未能解决你的问题,请参考以下文章

Java怎么清除缓存

ios获取缓存文件的大小并清除缓存

iOS获取缓存文件的大小并清除缓存

我需要清除哪些 Laravel 缓存以删除有关丢失迁移文件的错误?

Linux删除文件 清除缓存

清除缓存后没有更新css文件