【问题标题】:Memory mapping of files and system cache behavior in WinXPWinXP中文件和系统缓存行为的内存映射
【发布时间】:2010-05-04 10:52:21
【问题描述】:

我们的应用程序是内存密集型的,并且处理读取大量磁盘文件。总负载可能超过 3 GB。

有一个自定义的内存管理器,它使用内存映射文件来实现读取如此庞大的数据。这些文件仅在需要时才映射到进程内存空间,这样进程内存就得到了很好的控制。但是观察到的是,通过内存映射,系统缓存不断增加,直到它占用可用的物理内存。这会导致整个系统变慢。

我的问题是如何防止系统缓存占用物理内存?我试图删除文件缓冲(通过使用 FILE_FLAG_NO_BUFFERING ),但是这样,读取操作会花费大量时间并降低应用程序性能。如何在不牺牲太多性能的情况下实现可扩展性。这种情况下常用的技术有哪些?

我对 WinXP 操作系统的缓存行为不太了解。任何解释相同内容的好链接也会有所帮助。

【问题讨论】:

  • 您是否一次将整个文件映射到内存中?对于大文件,您应该映射较小的视图。
  • 是的,我正在映射整个文件,但文件通常为 1MB。并且它们仅在需要时才被映射并在以后取消映射。取消映射不会导致系统缓存被释放。它一直在积累。

标签: caching winapi file-io windows-xp


【解决方案1】:

我从事文件备份产品的工作,因此我们经常遇到类似的情况,我们自己的文件访问会导致缓存管理器保留数据——这可能会导致内存使用量激增。

默认情况下,Windows 缓存管理器将尝试通过提前读取来发挥作用,并保留文件数据以备再次需要时使用。

有几个注册表项可让您调整缓存行为,我们的一些客户在此方面取得了良好的效果。

XP 的独特之处在于它具有一些服务器功能,但默认情况下针对桌面程序进行了优化,而不是缓存。您可以在 XP 中启用系统缓存模式,这会导致留出更多内存用于缓存。这可能会提高性能,或者您可能已经在这样做并且它会产生负面影响!你可以阅读here

我不能推荐自定义内存管理器,但我知道大多数重量级应用程序都有自己的缓存(Exchange、SQL)。您可以通过运行process monitor. 来观察这一点

如果你想完全阻止缓存管理器使用内存来缓存你的文件,你必须禁用读写缓存:

FILE_FLAG_NO_BUFFERING 和 FILE_FLAG_WRITE_THROUGH

还有其他提示可以给CM,(随机访问,临时文件)阅读这篇关于缓存行为的文档here

即使您禁用缓存,您仍然可以获得良好的读取性能,但是您必须通过让自己的后台线程进行预读来模拟缓存管理器的行为

另外,我建议升级到服务器级操作系统,即使是 Windows 2003 也会为您提供更多缓存管理器调整选项。当然,如果您可以迁移到 Windows 7 / Server 2008,由于动态分页/非分页池大小调整和工作集改进,您将在相同物理资源的情况下获得更多性能改进。 here有一篇不错的文章@

【讨论】:

    【解决方案2】:

    在记事本中输入并保存为 .vbs 文件。每当您意识到系统 RAM 太低时运行它。系统缓存被清除并加到 RAM 中。我在网上的其他地方找到了它并在这里提供它,以便它可以帮助你。此外,建议注意第一条记录不应超过实际 RAM 的一半。因此,如果您有 1 GB 内存,请从您的 vbs 文件中的以下文本开始。

    FreeMem=Space(240000000) <This one is to clear 512 MB ram> 
    FreeMem=Space(120000000)  <This one is to clear 256 MB ram>   
    FreeMem=Space(90000000)   <This one is to clear 128 MB ram> 
    FreeMem=Space(48000000)  <This one is to clear 64 MB ram> 
    FreeMem=Space(20000000)   <This one is to clear 52 MB ram> 
    

    【讨论】:

      猜你喜欢
      • 2011-07-30
      • 1970-01-01
      • 2012-07-06
      • 1970-01-01
      • 2012-12-23
      • 1970-01-01
      • 1970-01-01
      • 2017-11-23
      • 1970-01-01
      相关资源
      最近更新 更多