【问题标题】:RAMdisk slower than disk?RAMdisk 比磁盘慢?
【发布时间】:2011-04-25 03:39:57
【问题描述】:

我创建的一个 python 程序是 IO 有界的。大部分时间(超过 90%)都花在一个重复约 10,000 次的循环中。在这个循环中,大约 100KB 的数据被生成并写入一个临时文件;然后它被另一个程序读回并收集有关该数据的统计信息。这是将数据传递到第二个程序的唯一方法。

由于这是主要瓶颈,我认为将临时文件的位置从我的主 HDD 移动到 (~40MB) RAMdisk(在超过 2GB 的可用 RAM 内)会大大提高此文件的 IO 速度从而减少运行时间。但是,我得到了以下结果(每个结果平均超过 20 次):

  • 测试数据 1:不带 RAMdisk - 72.7s,带 RAMdisk - 78.6s
  • 测试数据 2:不带 RAMdisk - 223.0s,带 RAMdisk - 235.1s

RAMdisk 似乎比我的 HDD 慢。

这可能是什么原因造成的?

除了使用 RAMdisk 来获得更快的文件 IO,还有其他替代方法吗?

【问题讨论】:

    标签: performance file ramdisk


    【解决方案1】:

    你能分批写出数据而不是一次写出一个项目吗?您是在缓存打开文件句柄等资源还是清理它们?您的磁盘写入是否阻塞,是否可以使用后台线程使 IO 饱和,同时不影响计算性能。

    我会首先考虑优化磁盘写入,然后在优化完成后查看更快的磁盘。

    【讨论】:

    • 关键是他现在使用的是纯内存——甚至根本不是磁盘。不出所料,他应该获得比市场上最快的 SSD 更好的性能 - 但它比机械驱动器慢。他在问为什么会这样。
    • 是的,我很感激。我的意思是,问题可能不是磁盘,而是磁盘的使用方式。
    • Arafangion:“RAM = 电子,磁盘 = 机械”的想法不再正确。欢迎您的操作系统在需要时将内存页面复制到磁盘(RAM -> 机械),或者在需要时将文件缓存在内存中(磁盘 -> 电子)。脏页(代码、数据或文件)只有在需要 RAM 用于某些事情时才会被刷新到机械盘中。
    【解决方案2】:

    您的操作系统几乎可以肯定已经在缓冲/缓存磁盘写入。 RAM 磁盘的性能如此接近也就不足为奇了。

    在不确切知道您在写什么或如何写的情况下,我们只能提供一般性建议。一些想法:

    • 如果您有 2 GB RAM,您可能拥有一个不错的处理器,因此您可以将此数据写入具有压缩功能的文件系统。假设您的数据符合条件,这将用 I/O 操作换取 CPU 时间。

    • 如果您正在执行许多小型写入,请将它们组合起来以一次写入较大的部分。 (可以看源码吗?)

    • 您是否在使用后删除 100 KB 文件?如果您不需要它,请删除它。否则操作系统可能会被强制刷新到磁盘。

    【讨论】:

      【解决方案3】:

      我知道 Windows 非常积极地将磁盘数据缓存到 RAM 中,100K 很容易满足。写入将直接进入缓存,然后可能通过非阻塞写入写入磁盘,从而允许程序继续。 RAM 磁盘可能不支持非阻塞操作,因为它希望这些操作快速且不值得费心。

      通过减少程序和缓存的可用内存量,您将增加用于分页的磁盘 I/O 量,即使只是略微增加。

      这都是我的猜测,因为我不熟悉内核或驱动程序。我还推测 Linux 也会以类似方式运行。

      【讨论】:

        【解决方案4】:

        我也有过同样令人难以置信的经历,经过多次尝试,我想通了。 当 ramdisk 格式化为 FAT32 时,即使基准测试显示高值,实际使用实际上比 NTFS 格式化 SSD 慢。 但 NTFS 格式的 ramdisk 在现实生活中比 SSD 更快。

        【讨论】:

          【解决方案5】:

          在我的测试中,我发现不仅批量大小会影响整体性能,还会影响数据本身的性质。仅在一种情况下,与 SSD 相比,我设法获得了 5 倍的写入时间:将 100MB 的预煮随机字节数组块写入 RAM 驱动器。写入更多“可预测”数据,如字母“aaa”或当前日期时间会产生完全相反的结果 - SSD 总是更快或相等。所以我的猜测是操作系统(在我的例子中是 Win 7)做了很多缓存和优化。 看起来 RAM 驱动器最受阻碍的情况是当您执行大量小写入而不是一些大写入时,RAM 驱动器在写入大量难以压缩的数据时表现出色。

          【讨论】:

            【解决方案6】:

            我加入了 RAM 磁盘速度问题(仅在 Windows 上)。

            我拥有的 SSD 可以以 550 MiB/s 的速度写入 30 GiB(在一个大块中,转储一个 30GiB RAM 阵列)(写入 30 GiB 大约需要 56 秒)......如果要求写入在一个源代码语句中。

            我拥有的 RAM 磁盘 (imDisk) 可以写入 30 GiB 写入(在一个大块中,转储一个 30GiB RAM ARRAY),速度略低于 100 MiB/s(大约 5 分 13 秒写入 30 GiB) ...这是在一个源代码句子中询问写入的情况。

            我还进行了另一次 RAM 测试:从源代码执行顺序直接写入(每个源代码循环传递一个字节)到 30GiB RAM 阵列(我有 64GiB 的 RAM),我的速度接近 1.3GiB/ s(每秒 1298 MiB)。

            为什么(在 Windows 上)RAM 磁盘对于一次 BIG 连续写入如此缓慢?

            当然,低写入速度发生在 Windows 上的 RAM 磁盘上,因为我在 Linux 上使用 Linux 本机 ram 磁盘测试了相同的“概念”,而 Linux ram 磁盘可以以接近每秒 1 GB 的速度写入。

            请注意,我还在 Windows 上测试过 SoftPerfect 和其他 RAM 磁盘,RAM 磁盘速度几乎相同,不能以每秒超过 100 兆字节的速度写入。

            实际测试的 Windows:10 和 11(在 HOME 和 PRO 上,在 64 位上),RAM 磁盘格式(exFAT 和 NTFS);由于 RAM 磁盘速度太慢,我试图找到一个 RAM 磁盘速度正常的 Windows 版本,但没有找到。 实际测试的 Linux 内核:只有 5.15.11,因为 Linux 原生 RAM 磁盘速度正常,所以我没有在任何其他内核上进行测试。

            希望这对其他人有所帮助,因为知识是解决问题的基础。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-11-06
              • 1970-01-01
              • 2019-04-05
              • 2014-04-29
              • 1970-01-01
              • 1970-01-01
              • 2020-12-16
              • 1970-01-01
              相关资源
              最近更新 更多