WinXP中文件的内存映射和系统缓存行为

时间:2010-05-04 10:52:22

标签: caching winapi file-io windows-xp

我们的应用程序是内存密集型的,它涉及读取大量磁盘文件。总负载可超过3 GB。

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

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

我对WinXP操作系统缓存行为没有很好的理解。任何解释相同的好链接也会有所帮助。

2 个答案:

答案 0 :(得分:3)

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

默认情况下,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

的文章很好

答案 1 :(得分:1)

在记事本中输入此内容并将其另存为.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>