内存映射文件 vs RAM磁盘

5

对于游戏《我的世界》,运行服务器应用程序的一般方法是在RAMDisk中运行它,因为它使用数百个小文件进行世界生成,而I/O速度是主要瓶颈。

最近,我尝试使用Dokan / ImDisk为Server Application动态创建RAMDisk。但是,Dokan比平均硬盘驱动器慢得多,而我无法使ImDisk正常工作。由于这是我所知道的唯一具有.NET API的两个文件系统驱动程序,我现在正在寻找替代方案。

之前有人向我提到过尝试使用Memory-Mapped Files。我当前的方法是创建RAMDisk,创建Game Server数据文件夹和RAMDisk之间的符号链接,然后启动Game Server进程。

  • Memory-Mapped Files是否可以以相同的方式工作,即创建一个虚拟驱动器,我可以在其中创建象G:\Data_Files\这样的符号链接?

  • 除了Dokan/ImDisk外,是否还有其他具有.NET API /绑定的替代方案?


不太确定C#/.net在这里起到了什么作用。 - CodesInChaos
但是你的应用程序需要如何与RAM磁盘驱动程序交互呢?难道你不能只加载现有的RAM磁盘驱动程序吗?如果你想运行一个Minecraft服务器,不太确定你为什么需要一个C#应用程序。如果这不是Minecraft而是你自己的应用程序,为什么一开始就要使用许多小文件呢? - CodesInChaos
RAM磁盘是DOS时代的遗物。在现代多任务操作系统中,它是一种宝贵的资源,太珍贵了,不能浪费在存储文件上。这样的操作系统有一个文件系统缓存,它的工作方式就像RAM磁盘一样。但是,它具有相当大的优势,即操作系统可以根据需要动态调整其大小,以找到文件系统和需要内存的进程之间的良好平衡点。如果有一个RAM磁盘驱动程序可以比Windows做得更好,那么它就是一个保密得很好的秘密。 - Hans Passant
@Hans,并不完全是这样。您可以拥有几GB大小的RAM磁盘,而缓存则小得多。确实存在一些RAMDisk产品,其中一些甚至支持32位系统上超过4GB的内存,它们在诸如保留临时文件等任务中表现完美。 - Eugene Mayevski 'Callback
1
只需使用64位操作系统。你的建议被你的商业利益所蒙蔽。 - Hans Passant
2个回答

3
有几种方法取决于你的任务具体情况。
如果你需要使用文件系统(即通过文件系统 API 函数和类),并且希望速度快,那么(如我在回答你之前的问题时建议的那样)你需要创建一个 RAMDisk 驱动程序。Windows Driver Kit 包括一个示例驱动程序,它(巧合吗?)的名称为“RamDisk”。但是,驱动程序开发比较棘手,如果示例出了问题或者你需要扩展它,你就需要深入研究内核模式开发(或者雇佣某人来完成这项工作)。为什么要使用内核模式?因为正如你在 Dokan 中看到的那样,切换回用户模式存储数据会导致严重的减速。
如果你只需要使用 Stream 类方便地管理一堆文件,并可以将所有内容刷新到磁盘中,那么你可以利用其中一个虚拟文件系统。我们的 SolFS (Application Edition) 是其中之一,你可以使用它(我还记得 CodeBase 文件系统,但他们似乎没有提供评估版本)。SolFS 看起来很适合你的任务,所以如果你也这么认为,可以私下联系我(请参阅我的个人资料)寻求协助。
回答您的问题:
1. 不,内存映射文件(MMF)实际上是磁盘上的文件(包括虚拟磁盘,如果您有一个),可以直接使用内存操作而不是文件系统 API 访问。MMF 对于大多数文件操作来说通常更快,这就是为什么它们经常被提到的原因。
2. 我们的 Callback File System 或 CallbackDisk 产品(请参见 virtual storage 行)是另一种选择,然而,正如我在第一段中提到的那样,由于用户模式上下文切换,它们无法解决您的问题。
更新:我没有看到驱动程序有任何障碍,在需要时在内存中有一个副本并异步写入磁盘。但是,这将需要修改示例 RAMDisk 驱动程序(这涉及相当多的内核模式编程)。
使用 SolFS 或其他虚拟文件系统,您也可以在磁盘上有存储的副本。在虚拟文件系统的情况下,似乎使用磁盘上的容器文件将给您令人满意的结果(因为虚拟文件系统通常具有内存高速缓存),您根本不需要保留内存中的副本。

非常好的答案,非常感谢。那么有没有备份数据到物理磁盘的替代方法,而不是切换回用户模式? - user470760
感谢您的所有帮助。我实际上只是使用标准I/O和ImDisk进行了一些读/写测试,并对速度的提升感到震惊,因此我相信我会继续努力让API正常工作。非常感谢您提供的信息! - user470760

3

在查看了许多解决方案并进行了一些基准测试后,我们选择了DataRam的RAMDisk。我们曾经研究过很多Windows驱动程序和其他免费解决方案,但最终无法与商业解决方案相比较其小得多的价格。


如果不想使用Windows商业RAMDISK,而是使用Win8或Server 12或更新版本,可以运行Linux虚拟机,挂载tmpfs(RAMDISK),然后通过SAMBA共享已挂载的RAMDISK。http://serverfault.com/questions/267116/improving-exim-performance-mounting-message-queue-on-ramdisk - yzorg
3
哎呀!实现这个需要耗费很大的开销!你最好想办法在Linux上运行该软件。有些RAM磁盘解决方案是免费的,而其他一些则免费提供N GB的RAM容量。如果这对应用程序真的很关键,那就获取Windows本机驱动程序或在Linux上运行该软件吧。 - Jonathan Oliver

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