5

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

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

4

2 回答 2

3

答案是高度特定于操作系统的。一般来说,缓存这些数据是没有意义的。“缓存的”数据和内存映射的数据都可以随时分页。

如果有任何差异,它将特定于操作系统 - 除非您需要那种粒度,否则缓存数据是没有意义的。

于 2010-03-25T14:48:17.603 回答
3

我想提一些我读过的关于这个主题的东西。答案是否定的,您不想再猜测操作系统的内存管理器。

第一个想法是您希望您的程序(例如 MongoDB、SQL Server)尝试根据可用 RAM 的百分比来限制您的内存:

在只有 x% 可用之前不要尝试分配内存

有时,客户会要求一种方法来设计他们的程序,以便它继续消耗 RAM,直到只有 x% 可用。这个想法是他们的程序应该积极地使用 RAM,同时仍然保留足够的可用 RAM (x%) 用于其他用途。除非您正在设计一个系统,而您是计算机上唯一运行的程序,否则这是一个坏主意。

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

接下来来自Varnish作者的一些笔记,以及反向代理:

Varnish Cache - 来自架构师的笔记

因此,squid 精细的内存管理会发生什么,它会与内核精细的内存管理发生冲突,就像任何内战一样,它永远不会完成任何事情。

发生的事情是这样的:Squid 在“RAM”中创建了一个 HTTP 对象,并在创建后快速使用了一些时间。然后过了一段时间,它不再受到点击,内核注意到了这一点。然后有人试图从内核获取内存,内核决定将那些未使用的内存页面推送到交换空间,并更明智地使用(缓存-RAM)来处理程序实际使用的一些数据。然而,这是在鱿鱼不知道的情况下完成的。Squid 仍然认为这些 http 对象在 RAM 中,并且它们会在它尝试访问它们的那一刻,但在那之前,RAM 被用于生产一些东西。

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

  • 操作系统已将硬盘驱动器上已存在的内容写入硬盘驱动器

接下来是您想要从“缓存”内存而不是“真实”内存执行查找的时候。您尝试访问“缓存”,并且由于它已从 RAM 中换出,因此硬件会引发 a PAGE FAULT,并且缓存会被换回 RAM。

  • 您的缓存内存与“真实”内存一样慢,因为两者都不再在 RAM 中

最后,你想释放你的缓存(也许你的程序正在关闭)。如果“缓存”已被换出,操作系统必须首先将其换回,以便可以释放它。相反,如果您只是取消映射内存映射文件,则一切都消失了(无需交换任何内容)。

  • 在这种情况下,您的缓存会使事情变慢

再次来自 Raymon Chen:如果您的应用程序正在关闭 - 已经关闭:

当 DLL_PROCESS_DETACH 告诉你​​进程正在退出时,你最好的选择就是不做任何事情就返回

我经常使用不遵循此规则的程序。该程序在其生命周期中分配了大量内存,当我退出程序时,它只会在那里停留几分钟,有时会以 100% CPU 旋转,有时会搅动硬盘(有时两者兼而有之)。当我进入调试器查看发生了什么时,我发现程序没有做任何有成效的事情。它只是有条不紊地释放它在其生命周期中分配的每一个内存字节。

如果我的计算机没有承受很大的内存压力,那么程序在其生命周期内分配的大部分内存还没有被调出,所以释放最后一滴内存是一个 CPU 密集型操作。另一方面,如果我开始构建或执行其他内存密集型操作,则程序在其生命周期内分配的大部分内存已被分页,这意味着程序将所有内存从硬盘驱动器,这样它就可以免费调用它。听起来有点恶意,其实。“过来,我可以告诉你走开。”

所有这些固执的内存管理都是毫无意义的。进程正在退出。当地址空间被破坏时,所有内存都将被释放。别再浪费时间了,现在就退出吧。


现实情况是,程序不再在“RAM”中运行,而是在内存——虚拟内存中运行。

可以使用缓存,但必须使用操作系统的虚拟内存管理器:

  • 您希望将缓存保持在尽可能少的页面
  • 您希望确保它们留在 RAM 中,因为它们被大量访问(即实际上是一个有用的缓存)

访问:

  • 400GB 文件周围的一千个 1 字节位置

比访问要贵得多

  • 400GB 文件中的单个 1000 字节位置

换句话说:你真的不需要缓存数据,你需要一个更加本地化的数据结构

如果您将重要数据限制在单个 4k 页面中,您将更好地使用 VMM;Windows您的缓存。

当您添加 64 字节四字对齐的高速缓存行时,更有动力调整您的数据结构布局。但是你不希望它紧凑,否则你将开始遭受来自False Sharing的缓存刷新的性能损失。

于 2012-05-17T02:24:16.427 回答