但我现在面临“我应该缓存多少数据”的问题,想知道在 Windows 上是否有关于采取哪种策略的黄金规则。缓存是在客户端上进行的,我不需要在服务器上进行缓存。
- 我是否应该始终保持全局内存使用率低于x%?这将是多少?如果启动了另一个程序并占用了大量内存,我应该清空缓存吗?
- 我是否应该在缓存之前请求可用的空闲内存量,并使用该内存的固定百分比来满足我的需求?
- 我希望不必这样做,但我是否应该询问用户愿意分配给我的应用程序多少内存?如果是这样,我如何计算该属性的默认值以及永远不会使用该设置的用户的值?
但我现在面临“我应该缓存多少数据”的问题,想知道在 Windows 上是否有关于采取哪种策略的黄金规则。缓存是在客户端上进行的,我不需要在服务器上进行缓存。
FILE_ATTRIBUTE_TEMPORARY
属性的文件将数据写入,并利用客户端机器的缓存。尽管这种方法似乎意味着你使用文件,但如果系统中有可用内存,则该文件永远不会离开缓存并且始终保留在内存中。一些优点包括:1. 无需编写任何代码。2. 系统缓存考虑到所有运行的其他进程,你自己实现这一点并不实际。3. 在64位Windows上,系统可以使用其可用的所有内存作为缓存。在32位Delphi进程中,你受限于32位地址空间。4. 即使缓存已满并且需要将文件刷新到磁盘,本地磁盘访问比查询数据库然后通过网络传输文件要快得多。这取决于服务器上运行的其他软件。首先,我会使其可以手动配置。开发一个可以使用特定内存量的系统。如果可以的话,在运行时可以更改该值。
如果您有这些可能性,可以尝试一些微调以查看哪种方法最有效。我不知道任何黄金规则,但我认为您应该能够设置总内存或可用内存的百分比,并保留特定数量的内存始终空闲供系统使用。如果您为服务器操作系统保存了至少500 MB的内存,则可以使用其余部分或其余部分的90%作为缓存。但是这些数字取决于操作系统的版本和服务器上运行的其他应用程序。
我认为最好从外部使这些数字可配置,并创建一个管理工具,让您首先手动设置这些值。然后,如果您找到了最佳方法,可以推导出计算这些值的公式,并将它们集成到您的管理工具中。此工具不应是缓存程序本身的组成部分(该程序可能是没有GUI的服务)。
一个服务器应用程序通常需要由管理员设置的资源供其自己使用。我不关心其他应用程序的行为,我关心的是成为一个“有礼貌”的应用程序,因此它应该允许管理员配置内存缓存大小等,只有管理员才知道如何正确配置他的系统(通常...)
默认值应该考虑到整体可用内存有多少,特别是在32位系统上,内存小于4GB(只要Delphi提供的是32位应用程序),留出一些空间给操作系统,并避免过于频繁的交换。建议在安装时询问用户选择。
如果应用程序是在服务器上唯一运行的,则可以将可用内存的40%至75%之间的值视为可接受的(取决于缓存之外需要多少内存),但再次询问用户,因为几乎不可能知道其他正在运行的应用程序可能需要什么。您还可以拥有最小缓存大小和最大缓存大小,从分配较低的值开始,然后在需要时增加它,如果必要则缩小它。
在32位系统上,这是一种可以通过使用PAE/AWE来访问超过3GB内存的内存使用方式。
更新:您还可以监视缓存命中/未命中情况,并计算哪种缓存大小最适合用户需求(它可能太小,但也可能太大),然后向用户提供建议。
问题:
一张图片可以被多个客户端请求吗?或者,一张图片可以在短时间内被多次请求吗?
间隔时间有多短?
网络速度真的很快吗?比硬盘的读写速度快吗?如果你有一个正常的网络,那么硬盘将能够实时从磁盘中读取文件并通过网络传递它们。尤其是Windows已经做了一些良好的缓存,所以最近的文件已经在缓存中。
运行服务器应用程序的计算机的主要目的是运行服务器吗?还是普通计算机也用于其他任务?换句话说,它是专用服务器还是普通工作站/台式机?
但是我应该问用户愿意为我的应用程序分配多少内存吗?
我肯定会这样做!如果用户认为服务器应用程序不是重要的应用程序,它可能会给予低优先级(低缓存)。否则,如果它认为它是最重要的正在运行的应用程序,它将允许应用程序分配所需的所有RAM,而牺牲其他不那么重要的应用程序。
只需将该设置默认为可接受的值(例如总RAM量的x%)并交付应用程序即可。如果计算机的主要目的是托管此服务器应用程序,则我将使用总RAM量的70%,如果其目的是“通用使用”计算机,则使用总RAM量的40-50%。