【问题标题】:How can I force Windows to clear all disk read cache data? [duplicate]如何强制 Windows 清除所有磁盘读取缓存数据? [复制]
【发布时间】:2010-07-18 15:34:32
【问题描述】:

可能重复:
How to invalidate the file system cache?

我正在编写一个磁盘密集型 win32 程序。第一次运行时,它使用 FindFirstFile()/FindNextFile() 扫描用户的文件夹时运行速度要慢很多。

如何在不重新启动的情况下重复第一次表演?有没有办法强制系统丢弃磁盘缓存中的所有内容?

我知道,如果我正在读取单个文件,我可以通过将 FILE_FLAG_NO_BUFFERING 标志传递给对 CreateFile() 的调用来禁用缓存。但是在搜索文件时似乎无法做到这一点。

【问题讨论】:

  • +1 我正准备自己发布相关帖子。在尝试计算磁盘相关算法的性能时,缓存确实会阻碍。好问题。

标签: windows winapi


【解决方案1】:

您是否考虑过在不同的卷上执行此操作,然后卸载/重新安装该卷?这将导致绝大多数内容都从磁盘重新读取(尽管那里的缓存不在乎)。

【讨论】:

  • +1 -- 这是唯一一致的方法。
【解决方案2】:

您需要创建足够的内存压力,以使内存管理器和缓存管理器丢弃之前的缓存结果。对于缓存管理器,您可以尝试打开一个启用缓存的大(即大于物理内存)文件,然后向后读取(以避免任何顺序 I/O 优化)。 vm 和缓存管理器之间的交互稍微复杂一些,并且更多地依赖于操作系统版本。

控制器(可能,但不太可能)和磁盘驱动器本身(可能)上也有缓存。有特定的 IoCtls 可以刷新此缓存,但根据我的经验,磁盘固件在此领域未经测试。

【讨论】:

  • 这正是我一直在做的事情。一种简单的方法是打开一个大文件并搜索文件中不存在的字节序列。 Windows 将用新文件淹没缓存并将旧数据推出。这并不理想,但确实有效。
【解决方案3】:

查看 SysInternals 的 CacheSet 的清除功能。

【讨论】:

  • 我在windows xp上试了一下,清除缓存后枚举磁盘文件夹的速度和以前一样快,所以好像不行。
【解决方案4】:

您可以通过使用虚拟机来避免物理重启。

【讨论】:

  • 这不起作用。主机操作系统最终也会进行缓存,这使得测试不准确。
【解决方案5】:

我尝试了答案中的所有方法,包括 CacheSet,但它们不适用于 FindFirstFile/FindNextfile()。这是有效的:

  • 通过网络扫描文件。扫描共享驱动器时,windows好像没有缓存文件夹,所以每次都慢。

  • 使任何算法变慢的最简单方法是插入对 Sleep() 的调用。这可以揭示多线程代码中的许多问题,而这正是我真正想要做的。

【讨论】:

  • 请注意,Windows SMB 客户端和 Windows SMB 服务器有自己的缓存,然后您正在处理这些缓存(以及 HDD 和其他缓存、SAN 级别、RAID 控制器......)。你最好的选择,因为 CacheSet 的魔法不起作用(我同意),是“淹没缓存”,以便它清除以前的条目。也就是说,你必须弄清楚所有涉及到的缓存的大小并把它们填满,这样你以前读/写的数据就会被推出(或刷新到稳定的存储)。请参阅 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters reg_dword:TreatHostAsStableStorage。
猜你喜欢
  • 2011-04-04
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
  • 1970-01-01
  • 1970-01-01
  • 2022-12-20
相关资源
最近更新 更多