5

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

在最近的一次尝试中,我尝试使用 Dokan/ImDisk 以编程方式为服务器应用程序创建 RAMDisk。Dokan 比普通硬盘慢得多,而且我无法让 ImDisk 正常运行。由于这些是我所知道的仅有的 2 个具有 .NET API 的文件系统驱动程序,因此我现在正在寻找替代方案。

之前有人提到过尝试内存映射文件。我目前的方法是创建 RAMDisk,在游戏服务器的数据文件夹和 RAMDisk 之间创建符号链接,然后启动游戏服务器进程。

  • 内存映射文件可以以相同的方式运行,IE 创建一个我可以创建符号链接的虚拟驱动器吗?如 G:\Data_Files\?

  • Dokan/ImDisk 还有其他替代品吗?

4

2 回答 2

3

在查看了一堆解决方案并进行了一些基准测试之后,我们无法放弃DataRam 的 RAMDisk。我们使用了一堆 Windows 驱动程序和其他一些免费的解决方案,最终无法证明与商业解决方案的微小价格相比,这笔费用是合理的。

于 2012-07-13T11:52:58.480 回答
2

有几种方法取决于您的任务的具体情况。

如果您需要使用文件系统(即通过文件系统 API 函数和类),并且希望它快速运行,那么(正如我在回复您之前的问题时建议的那样)您需要创建一个 RAMDisk 驱动程序。Windows Driver Kit 包括一个示例驱动程序,(巧合?)名称为“RamDisk”。但是,驱动程序开发很棘手,如果示例出现问题或者您需要对其进行扩展,您将需要深入研究内核模式开发(或聘请某人来完成这项工作)。为什么是内核模式?正如您在 Dokan 中看到的那样,切换回用户模式来存储数据会导致严重的减速。

如果您只需要使用 Stream 类方便地管理内存中的一堆文件(有可能将所有这些文件刷新到磁盘),那么您可以使用其中一个虚拟文件系统。我们的SolFS(应用程序版)是您可以使用的此类产品之一(我还记得 CodeBase 文件系统,但它们似乎没有提供评估版)。SolFS 似乎很适合您的任务,所以如果您也这么认为,您可以私下联系我(请参阅我的个人资料)寻求帮助。

要回答您的问题:

  1. 不,内存映射文件(MMF)实际上是磁盘上的文件(包括虚拟磁盘,如果有的话),不能通过文件系统 API 而是直接使用内存操作来访问。对于大多数文件操作,MMF 往往更快,这就是它们经常被提及的原因。

  2. 我们的 Callback File System 或 CallbackDisk 产品(参见virtual storage line)是一种替代方案,但是,正如我在第一段中提到的,由于用户模式上下文切换,它们不会解决您的问题。

更新: 我认为驱动程序在内存中有副本并在需要时异步执行磁盘写入没有障碍。但这需要修改示例 RAMDisk 驱动程序(这涉及到相当多的内核模式编程)。

使用 SolFS 或其他虚拟文件系统,您也可以在磁盘上拥有存储的副本。在虚拟文件系统的情况下,使用磁盘上的容器文件可能会给您带来令人满意的结果(因为虚拟文件系统通常具有内存缓存)并且您根本不需要保留内存中的副本。

于 2011-08-13T10:52:57.190 回答