我一直在考虑使用 RAMDisks 上的临时 GIT 存储库(使用 DataRAM 的 ramdisk)作为一种对象存储。我很想知道这是否值得,所以我运行了一个简单的基准测试,将 1000 x 30K 文件写入驱动器,然后比较了平均写入时间。当性能出来时,我感到惊讶始终如一有利于 HDD。
对于我得到的 HDD:
average: 0.47ms/write
对于我获得的 RAM 磁盘:
average: 0.76ms/write
谁能解释为什么这与预期相反?
答案1
使用 DMA 时,CPU 将数据复制到内存中,并告诉硬盘获取数据并将其写入磁盘。当硬盘执行此操作时,CPU 可以执行其他操作。对于 30K 文件,硬盘可以跟上读取和写入的速度。这些文件适合缓存,并且无需写入磁盘即可完成写入。磁盘的旋转和使用磁臂寻道才是真正的限制因素。
我不知道 ramdisk 是如何实现的,但它可能让 CPU 进行两次复制。
答案2
也许 HDD 操作已经被您友好的操作系统缓存在内存中,并且 RAMDisk(部分)位于虚拟 RAM/交换空间中?
答案3
这个问题很难回答,但总的来说,你应该明白人工基准测试很少可靠。你应该尝试测试实际的 git 存储库。
我的猜测是,将文件写入磁盘之所以“快速”,是因为 CPU 只需向驱动器发出命令“获取此内存块并将其写入驱动器的此部分”,然后驱动器会异步处理该命令(即,一旦发出命令,操作即“完成”)。但是复制到 RAM 磁盘时,您实际上要等到数据物理复制完成,而且由于您基本上是在执行 RAM 到 RAM 的复制,因此会产生争用。
再次,如果您打算使用它,我建议您尝试在实际的 Git 存储库上进行实际操作。
答案4
我认为这里的问题不在于内核<>内存速度,而在于数据内存软件的实现。对于 unix 来说,存在适合此类用途的 tmpfs(并且不需要额外的第二文件系统层),然而数据内存产品是相当旧的未修改的软件,有(可能的)错误或使用旧的未优化的程序架构。
当我尝试从 dataram ramdisk 运行游戏客户端时,性能也受到了影响,实际上速度比从 IDE 驱动器运行更差……有时甚至会出现 BSOD(12gb RAM 总共 2.5gb ramdisk)。使用 4gb ramdisk 时性能更差(???)。
使用相同的系统,FreeBSD 可以轻松处理 4GB 以上的 tmpfs
然而,ImDisk 的作者在论坛上也指出,Windows 在所有 ramdisk 的内存管理方面都做了一些奇怪的事情,所以可能也存在 Windows 子系统的缺陷