设置:
Windows Server 2008 R2,托管在 HyperV 虚拟机上,分配了 3GB 内存。
我已经设置了一个 RAMDisk(容量为 512MB,足以满足我们的要求),使用磁盘管理在此虚拟网络服务器上并分配 3GB 的 RAM(托管应用程序在高负载下不需要超过~768MB)。
最初,WebRoot 目录位于网络共享上,其性能足够好,但在重负载下,这导致网络共享服务器的 LAN 流量明显增加(我相信它正在访问网络共享以向我的用户提供网页 - 应该发生这种情况吗?)。
由于 VM 托管在故障转移群集中,因此 VM 的 C:\ 驱动器存储在 iSCSI SAN 上,因此将 WebRoot 文件夹保留在 C:\ 驱动器上没有任何性能优势(已测试过)。
因此我选择将内容放到 RAMDisk 上,这当然在访问时间方面显示出了很大的改进。源内容仍将存储在网络共享中,但每 24 小时将同步到 RAM Disk。
任何人都有充分的理由相信这将:
A)不值得吗?
或者更重要的是,
B)这是一个彻头彻尾的坏主意!?
欢迎提出批评,无论正面还是负面!
答案1
IIS 不会缓存来自网络共享的内容,这就是您性能不佳的原因。但是,当文件存储在本地磁盘上时,它应该缓存这些文件。您的服务器是虚拟的,并且主机的磁盘存储在 iSCSI 磁盘上,这一事实不应影响 IIS 缓存文件的能力。
我无法想象在第一个请求之后,除非出现任何极端情况,否则 ramdisk 会比 IIS 的本机磁盘缓存具有性能优势。
我反对使用 RAM 磁盘,除非您遇到需要缓存的内容类型与 IIS 的缓存不相符的极端情况。我喜欢 KISS 规则。;-)
答案2
在虚拟机中使用 RAM 磁盘的功能与在物理机中使用 RAM 磁盘的功能几乎相同。
Windows(以及几乎所有其他操作系统)将使用任何额外的可用 RAM 进行文件缓存。它将尽可能长时间地保持您最近使用的文件可用,从而平衡内存需求和文件访问时间。
当您使用 RAM 磁盘时,您实际上是在说您事先知道哪些文件需要非常快速地可用,并且它们不会是最近使用的文件。如果它们实际上是最近使用的文件,那么通过使用 RAM 磁盘,您就放弃了更灵活地使用内存的机会,而这可能提高其他领域的性能。
在虚拟机中,从实际存储(而非 RAM 磁盘)读取文件所需的时间可能比在没有虚拟化的同一台机器中要长一些。因此,您需要问自己这个问题:
我是否正在使用具有真正良好存储子系统的功能强大的 VM 主机,或者我是否正在使用以前用于 IIS 的同一台机器,但现在我正在虚拟化 IIS 服务器?
如果是前者,文件读取延迟可能就没那么重要了。如果是后者,VM 中的文件读取延迟会更大,因此 RAM 磁盘可能更有意义。
此外,你还需要问自己另一个问题:
我是否只在此服务器上托管一个虚拟机,还是与多个工作负载共享此主机?
如果您正在共享主机,则需要考虑您为 RAM 磁盘提供给 IIS VM 的 RAM 是否可以由其他 VM 更好地使用。如果您在 VM 中启用了动态内存,那么它将被转移到当前需要它的 VM 中。如果允许在当前实际需要的地方使用该 RAM,而不是先验地决定应该使用它来降低 IIS 的文件访问延迟,那么您可能会完成更多的工作。