【问题标题】:Memory-Mapped Files vs. RAM Disk内存映射文件与 RAM 磁盘
【发布时间】:2011-10-26 08:49:09
【问题描述】:

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

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

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

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

  • 除了 Dokan/ImDisk 之外,还有 .NET API/Bindings 浮动的其他替代品吗?

【问题讨论】:

  • 不太清楚 C#/.net 是从哪里来的。
  • 但是您的应用程序需要如何与 RAM 磁盘驱动程序交互?你不能只加载现有的 RAM 磁盘驱动程序。如果您想运行我的世界服务器,不确定您需要 C# 应用程序做什么。如果是你自己的应用程序而不是 minecraft ,你为什么要使用很多小文件?
  • RAM 磁盘是 DOS 时代的遗物。它是现代多任务操作系统上的宝贵资源,太宝贵了,不能浪费在存储文件上。此类操作系统具有文件系统缓存,其工作方式类似于 RAM 磁盘。但是,操作系统可以根据需要动态调整其大小,以在文件系统和需要内存的进程之间找到良好的平衡,这具有相当大的附加优势。如果有一个 ram 磁盘驱动程序可以做得比 Windows 更好,那么它就是一个保守的秘密。
  • @Hans 这并非完全如此。您可以拥有几 Gb 大的 RAM 磁盘,而缓存要小得多。确实存在几种 RAMDisk 产品,其中一些甚至在 32 位系统上支持超过 4Gb,并且它们性能完美,尤其是在保存临时文件之类的任务中。
  • 只需使用 64 位操作系统。你的建议被你的商业利益蒙上了阴影。

标签: c# .net filesystems memory-mapped-files ramdisk


【解决方案1】:

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

【讨论】:

  • 不使用 Windows 商用 RAMDISK,如果使用 Win8 或 Server 12 或更高版本,可以运行 linux VM,挂载 tmpfs (RAMDISK),然后通过 SAMBA serverfault.com/questions/267116/…共享挂载的 RAMDISK@跨度>
  • 哎哟!完成这项工作的开销令人难以置信!你最好弄清楚如何让软件在 Linux 上运行。一些 RAM 磁盘解决方案是免费的,而另一些则最多可释放 N GB 的 RAM。如果它对应用程序真的那么重要,请获取适用于 Windows 的本机驱动程序或在 Linux 上运行该软件。
【解决方案2】:

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

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

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

回答你的问题:

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

  2. 我们的回调文件系统或回调磁盘产品(参见virtual storage 行)是一种替代方案,但是,正如我在第一段中提到的,由于用户模式上下文切换,它们无法解决您的问题。

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

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

【讨论】:

  • 很好的答案,非常感谢。那么有另一种方法可以将数据备份到物理磁盘而不是切换回用户模式?
  • 感谢所有帮助。实际上,我只是使用标准 I/O 和 ImDisk 进行了一些读/写测试,对速度的提高感到震惊,所以我相信我会追求让 API 工作。非常感谢您提供的信息!
猜你喜欢
  • 2015-10-23
  • 2010-12-28
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-15
相关资源
最近更新 更多