从内存映射文件中获取的数据是否有意义进行缓存?

5

或者重新从映射内存中再次读取数据会更快,因为操作系统可能会实现自己的缓存机制?

数据的性质事先不知道,假设文件读取是随机的。


这是一个非常好的问题,值得提出。除非有人问,否则他们不会知道答案。 - Ian Boyd
2个回答

3
答案高度依赖于操作系统。一般来说,缓存这些数据是没有意义的。无论是“缓存”数据还是内存映射数据都可以随时进行页面换出。
如果有任何差异,那将是特定于操作系统的 - 除非您需要这种细粒度,否则缓存数据是没有意义的。

3
我想提及一些关于这个主题的阅读内容。答案是,你不想对操作系统的内存管理器进行二次猜测。
第一个来自这样的思想,即您希望您的程序(例如MongoDB、SQL Server)尝试基于可用RAM的百分比来限制您的内存:

不要在只有x%空闲时尝试分配内存

偶尔会有客户要求设计他们的程序,以便它继续消耗内存,直到只剩下x%。 思路是他们的程序应该积极使用内存,同时仍然留有足够的可用内存(x%)供其他用途。 除非您正在设计一个计算机上运行的唯一程序的系统,否则这是一个坏主意。

(阅读文章了解为什么不好,包括图片的解释)

接下来是来自Varnish和反向代理作者的一些笔记:

Varnish缓存 - 架构师的笔记

那么squid复杂的内存管理会发生什么呢?它会与内核复杂的内存管理发生冲突,就像任何内战一样,这都不会有任何进展。

具体情况是这样的:Squid在“RAM”中创建一个HTTP对象,并在创建后快速使用数次。然后过了一段时间,它不再被使用,内核察觉到了这一点。然后有人尝试从内核获取某些内存,内核决定将这些未使用的内存页面推出到交换空间,并将(缓存-RAM)更明智地用于实际由程序使用的一些数据。然而,这是在Squid并不知道的情况下完成的。Squid仍然认为这些http对象在RAM中,直到它尝试访问它们时才会在RAM中,但在那之前,RAM被用于一些有生产力的东西。

想象一下,您确实从内存映射文件中缓存了某些内容。在未来的某个时候,保存该“缓存”的内存将被交换到磁盘上。

  • 操作系统已经将硬盘上已经存在的内容再次写入硬盘。
接下来,您想从“缓存”内存中执行查找,而不是“真实”内存。 您尝试访问“缓存”,由于它已从RAM中交换出来,因此硬件引发了“页面错误”,并将缓存交换回RAM。
您的缓存内存与“真实”内存一样慢,因为两者都不再位于RAM中。
最后,您想要释放缓存(可能是因为程序正在关闭)。 如果“缓存”已被交换出,则操作系统必须首先将其交换回来,以便可以释放它。 如果您只是取消映射了内存映射的文件,则所有内容都已消失(无需交换任何内容)。
在这种情况下,您的缓存会使事情变慢。
再次引用Raymon Chen的话:如果您的应用程序正在关闭-请立即关闭:

当 DLL_PROCESS_DETACH 告诉您进程正在退出时,最好的方法是什么都不做,直接返回

我经常使用一个程序,它不遵循这个规则。该程序在其生命周期内分配了大量内存,但当我退出程序时,它只会在那里静坐数分钟,有时以100%的CPU旋转,有时在磁盘上翻滚(有时两者兼备)。当我用调试器中断以查看发生了什么时,我发现该程序并没有做任何有意义的事情。它只是有条不紊地释放了它在其生命周期内分配的每一个字节的内存。

如果我的计算机没有承受太多的内存压力,那么该程序在其生命周期内分配的大部分内存尚未被分页出去,因此释放每一滴内存都是一个CPU密集型操作。另一方面,如果我启动了一个构建过程或执行了其他占用内存的操作,则该程序在其生命周期内分配的大部分内存已经被分页出去,这意味着该程序会从硬盘中重新加载所有内存,只为了能够调用free函数。实际上听起来有点恶意。“来这里,让我告诉你走开。”

所有这些过于细致的内存管理都是无意义的。进程正在退出。当地址空间被销毁时,所有这些内存都将被释放。别再浪费时间了,赶紧退出吧。


现实情况是程序不再在"RAM"中运行,而是在虚拟内存中的内存中运行。您可以利用缓存,但必须与操作系统的虚拟内存管理器一起工作:您希望将缓存保留在尽可能少的页面中,并通过它们被频繁访问(即实际上是有用的缓存)来确保它们保留在RAM中。访问400GB文件周围的1000个1字节位置比访问400GB文件中的单个1000字节位置要昂贵得多。换句话说,您不需要缓存数据,而是需要更本地化的数据结构。如果将重要数据限制在单个4k页面中,您将更好地与VMM协作;Windows是您的缓存。
当你添加64字节对齐的高速缓存行时,就更有动力调整数据结构布局。但是你不希望它过于紧凑,否则你将开始遭受来自虚假共享的高速缓存刷新的性能惩罚。虚假共享

同意。虽然如果您以口语方式理解“cached”的含义,如果磁盘上的表示与 RAM 中所需的表示不匹配,有时复制数据副本可能是有意义的。尽管这扩展了“cached”的含义,但在转换后,您可能会取消映射数据。 - uliwitness

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接