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

标签 caching winapi file-io windows-xp

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

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

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

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

最佳答案

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

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

关于caching - WinXP 中文件的内存映射和系统缓存行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2764613/

相关文章:

mysql - 如何减少浏览器的负载?

windows - 在 Windows 7 - 32 位系统上获取有关磁盘驱动器结果的信息

python - 编译后的 Python 写入程序文件

http - ETag 与 header 过期

database - 大型只读数据库推荐缓存

c++ - 将位图位从 GetDIBits 转换为 jpeg 以进行 winsock 传输

c++ - HeapFree() 崩溃的可能原因

c# - 'File.Open()' 和 'new FileStream()' 之间的区别

c - 是否有用于 C 的跨平台文件 IO/路径实用程序库?

.net - .NET 缓存框架