【问题标题】:How much memory should a caching system use on Windows?Windows 上的缓存系统应该使用多少内存?
【发布时间】:2011-09-12 07:52:21
【问题描述】:

我正在开发一个客户端/服务器应用程序,其中服务器保存大量数据,例如客户端请求的大图像或视频文件,我需要创建一个内存中的客户端缓存系统来保存一些那些大数据来加速这个过程。需要说明的是,每个单独的图像或视频并没有那么大,但它们的整体大小可能非常大。

但我面临着“我应该缓存多少数据”的问题,并且想知道 Windows 上是否有一些关于我应该采用什么策略的黄金法则。缓存在客户端完成,我不需要在服务器上缓存。

  1. 我是否应该始终保持在全局内存使用量的 x% 以下?那是多少?如果另一个程序启动并占用大量内存会发生什么情况,我应该清空缓存吗?
  2. 我是否应该在缓存之前请求有多少可用内存并使用该内存的固定百分比来满足我的需求?
  3. 我希望我不必去那里,但我应该问用户他愿意为我的应用程序分配多少内存?如果是这样,我如何计算该属性以及那些永远不会使用该设置的人的默认值?

【问题讨论】:

  • 那么,一个图像可以被多个客户端请求?或者,可以在 10 分钟的间隔内多次请求一张图像?
  • 图像可以被多个客户端请求,并且在 10 分钟间隔内多次请求,但我认为这无关紧要,因为我需要客户端的缓存策略,而不是服务器。
  • 我不明白。在服务器端,您想为每个客户端创建一个单独的缓存吗?
  • 不,我需要客户端缓存从服务器“下载”的数据,因为它们可能会被多次使用。

标签: windows delphi caching memory-management cache-control


【解决方案1】:

这取决于服务器上运行的其他软件。我首先可以手动配置它。开发一个可以使用特定内存量的系统。如果可以,请构建它,以便在它运行时更改该值。

如果您有这些可能性,您可以尝试进行一些调整以查看最有效的方法。我不知道任何黄金法则,但我认为您应该能够设置总内存的百分比或总可用内存的百分比以及特定的最小内存量,以便系统始终可用。如果您为服务器操作系统保存至少 500 MB,则可以将其余部分或 90% 的部分用于缓存。但这些数字取决于操作系统的版本和服务器上运行的其他应用程序。

我认为最好从外部配置数字并创建一个管理工具,让您首先手动设置值。然后,如果您发现最有效的方法,您可以扣除公式来计算这些值,并将它们集成到您的管理工具中。这个工具不应该是缓存程序本身的一个组成部分(无论如何它可能是一个没有 GUI 的服务)。

【讨论】:

  • 将一小部分留给系统并使用剩余部分(这里你说90%)的策略是不现实的。内存碎片可能会减少缓存的可用空间。
  • 感谢两位的意见。
【解决方案2】:

说实话,你问的问题不是我主要关心的问题。我会更关心我的缓存有多有效。如果你的文件真的那么大,你可以在缓存中保存多少?如果您的客户端服务器应用程序有很多用户,那么您的缓存实际上会缓存其他人会使用的东西的可能性有多大?

在您花太多时间在细节上之前,可能值得进行分析。

【讨论】:

  • 缓存由客户端完成,因此每个客户端都拥有自己的缓存。关于文件大小,每个文件都不是那么大,但将它们全部放在客户端缓存中的附加内存是问题,因此我的问题是我应该在客户端分配多少缓存。
【解决方案3】:

与其创建自己的缓存算法,不如将数据写入具有FILE_ATTRIBUTE_TEMPORARY 属性的文件并利用客户端计算机自己的缓存。

虽然这种方法似乎暗示您使用文件,但如果系统中有可用内存,则该文件将永远不会离开缓存,并且会一直保留在内存中。

一些优点:

  • 您无需编写任何代码。
  • 系统缓存会考虑所有其他正在运行的进程。你自己承担这些是不切实际的。
  • 在 64 位 Windows 上,系统可以将所有可用内存用于缓存。在 32 位 Delphi 进程中,您只能使用 32 位地址空间。
  • 即使您的缓存已满并且您的文件要刷新到磁盘,本地磁盘访问也比查询数据库然后通过网络传输文件要快得多。

【讨论】:

  • 这很有趣,但我有点担心防病毒扫描程序,正如以下帖子中提到的那样,它减慢了进程:stackoverflow.com/questions/5242676/…
  • 你只写一次,想必读了很多遍。病毒扫描程序,如果它确实扫描文件,将只花费一小部分时间。如果您在代码的热循环中一遍又一遍地写入文件,那么您可能会遇到问题。缓存的全部意义在于您不经常对其进行写入,但会更频繁地对其进行读取。
  • @John - 您可以设置一个例外,这样防病毒软件就不会扫描您的共享/缓存文件。
  • @David:注意文件缓存的工作方式及其默认设置。它在操作系统的客户端和服务器版本中有所不同(参见即support.microsoft.com/kb/837331),并且在所有进程之间共享。应用程序缓存受应用程序的唯一控制,应用程序知道如何处理其数据(即 MRU 或 LRU 列表?)
  • @ldsandon,您所说的可能对服务器应用程序是正确的,因为这些应用程序是自私的(即:无论其他应用程序如何,都可以根据需要获取尽可能多的非分页内存;如果没有足够的内存,管理员应该添加更多)。在桌面/客户端,事情不是这样工作的,用户实际上可能同时运行多个应用程序,都愿意获得尽可能多的缓存。试想一下,您的 Web 浏览器为其缓存分配大量非缓存内存,因为它真的“想要控制”。我会立即结束处理!
【解决方案4】:

服务器应用程序通常需要留出资源供其管理员使用。我不会关心其他应用程序的行为,我会关心成为一个“礼貌”的应用程序,因此它应该允许管理员配置内存缓存大小等,这是唯一知道如何正确配置他的系统的人(通常...)

无论如何,默认值都应该考虑到总体可用内存量,特别是在内存小于 4GB 的 32 位系统上(只要 Delphi 仅提供 32 位应用程序),以便为操作系统留出一些空闲并避免交换太频繁。建议用户在设置时选择它。

如果应用程序是唯一在服务器上运行的应用程序,则可用内存的 40% 到 75% 之间的值可能是可以的(取决于缓存之外需要多少内存),但再次询问用户,因为它几乎不可能知道正在运行的其他应用程序可能需要什么。您还可以设置最小缓存大小和最大缓存大小,首先分配较低的值,然后在需要时增大它,并在必要时缩小它。

在 32 位系统上,这是一种内存使用方式,可以从使用 PAE/AWE 访问超过 3GB 的内存中受益。

更新:您还可以监控缓存命中/未命中并计算最适合用户需要的缓存大小(它可能太小但也可能太大),并给出建议用户对此的看法。

【讨论】:

  • 如果缓存在客户端同样需要考虑,让用户选择最适合他的设置(像 Photoshop 这样的应用程序有类似的配置选项)。如果应用程序是用户在给定时间将使用的主要应用程序,它将愿意允许尽可能多的内存以有效地工作,但同样只有用户可能知道多少内存是可以的。另外,这个应用程序是针对“专业”用户还是“休闲”用户?前者通常需要控制,后者可能需要更多的指导和自动计算的值。
【解决方案5】:

问题:

  1. 一个图像可以被多个客户端请求?或者,可以在短时间内多次请求一张图片?

  2. 间隔有多短?

  3. 网速真的很高吗?比硬盘的速度还高??如果您有一个正常的网络,那么硬盘将能够从磁盘读取文件并通过网络实时传送它们。尤其是 Windows 已经做了一些很好的缓存,所以最近的文件已经在缓存中。

  4. 运行服务器应用程序的计算机的主要目的是运行服务器?还是只是一台普通计算机也用于其他任务?换句话说,它是专用服务器还是普通工作站/桌面?

但是我应该问用户多少钱 他愿意分配给我的记忆 申请?

我一定会去那里!!! 如果用户认为服务器应用程序不是一个重要的应用程序,它可能会给它低优先级(低缓存)。否则,它认为它是最重要的运行应用程序,它将允许应用程序分配它需要的所有 RAM,从而损害其他不太重要的应用程序。

只需将应用程序的默认设置设置为可接受的值(类似于 RAM 总量的 x%)。如果计算机的主要用途是保存此服务器应用程序,我将使用总 RAM 的 70%,如果其用途是“通用”计算机,我将使用大约 40-50%。

【讨论】:

  • 如上所述,我需要一个客户端缓存系统,其中从服务器“下载”的数据被缓存以便快速访问。不过感谢您的意见。
猜你喜欢
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 2016-04-29
  • 2017-08-24
相关资源
最近更新 更多