Linux - RAM 磁盘作为镜像逻辑卷的一部分

Sha*_*ald 14 linux raid lvm ramdisk

我们的服务器总 RAM 为 64GB,应用程序通常最多使用 30GB 的可用 RAM。其中一个应用程序处理大量平面文件,而我们遇到了吞吐量问题,即等待磁盘 I/O。在探索可能的解决方案时,出现了 RAM 磁盘的想法。RAM 磁盘的问题在于其固有的波动性。

我找到了有关 RAM 磁盘、RAID 1 配置和用于对物理磁盘进行分组的逻辑镜像卷的单独文档,但我似乎找不到任何文档表明这些磁盘复制解决方案是否可以与 RAM 磁盘一起使用。更重要的是,由于我们的想法是让 RAM 磁盘可用于读/写,并且让物理磁盘“遮蔽”RAM 磁盘,赶上写入操作,因此我们希望 RAM 磁盘成为所有磁盘的“主”磁盘读/写。

需要注意的是,我们希望避免仅使用 RAM 缓存操作系统中的文件,但如果我们能够获得与独立 RAM 磁盘相同的性能,那就可以了。我们最初避免了这种情况,因为有时某些文件不会长时间被访问,但仍然需要按需的读/写速度。

for*_*est 26

需要注意的是,我们希望避免仅使用 RAM 缓存操作系统中的文件,但如果我们能够获得与独立 RAM 磁盘相同的性能,那就可以了。我们最初避免了这种情况,因为有时某些文件不会长时间被访问,但仍然需要按需的读/写速度。

您可以用来vmtouch解决您的问题。这是一个实用程序,允许您将某些文件甚至整个目录以及它们下面的所有内容固定在页面缓存中,这样它们就不会被驱逐,即使它们长时间没有被访问(这是您不简单地访问它们的最初原因)依赖于页面缓存)。这最多需要与 RAM 磁盘相同的内存量,或者实际上更少。您仍将使用页面缓存,但它会产生与使用 RAM 磁盘相似的性能(实际上性能更优越,因为不涉及 MD 驱动程序)。


Ter*_*nen 13

这可以一起破解,但这是一个坏主意,并且可能在可靠性和可维护性方面存在多个问题。

我认为 RAMdisk 和物理磁盘的 RAID1 将受限于物理磁盘的性能,因为 RAID1 功能的一部分是确保两个副本同步。

对于读取,可能会有一些好处,因为 MD 驱动程序可以在不同设备之间分配读取。

创建此内容的可能步骤:

  1. 创建一个空文件,其中包含您要支持的数组的大小
  2. 用于losetup从文件中创建块设备。
  3. 用于用mdadm新创建的块设备和对应的硬盘分区创建阵列。
  4. 在新的 MD 阵列上创建文件系统。

我自己还没有尝试过,所以这只是理论上的例子。

  • 另外,在物理磁盘上使用 --write-mostly 标志。这会将大部分读取定向到 RAM 磁盘,从而释放物理磁盘以进行更多写入。 (4认同)

Aus*_*arn 8

首先,RAM 磁盘在 Linux 上几乎从来都不是正确的答案。因为它是块设备,所以任何读取最终都必须经过块层、文件系统和常规 VFS 层,并且数据除了存储在 RAM 磁盘中之外,最终还将缓存在 RAM 中。这种数据的重复以及所涉及的额外层数是 tmpfs 存在于 Linux 上的原因,tmpfs 文件系统不涉及块层,而是直接将数据存储在页面缓存中,跳过了所有额外的复杂性。它还会根据存储在其中的数据量自动调整大小(而不是必须预先定义大小),甚至可以利用交换空间。如果您认为需要 ramdisk,那么 99% 的情况下您应该真正使用 tmpfs。

\n
\n

现在,就实际解决方案而言......

\n

如果您的所有数据实际上都适合 RAM,那么您\xe2\x80\x99最好将其全部固定在 RAM 中,方法是使用vmtouch等工具,或者让应用程序 mmap 所有文件,然后对所有文件调用 mlock映射的区域。

\n

如果您的数据不能全部放入 RAM,您有两个现实的选择:

\n
    \n
  • 将压缩的数据存储在磁盘上,最好使用提供透明压缩的文件系统,例如 BTRFS、F2FS 或 ZFS。如果您有一个相当快的 CPU,这通常会减少读取大文件所需的时间,但代价是需要更多的 CPU 时间。改进通常与数据压缩的程度成正比,但在许多情况下可以轻松转化为 30% 或更多的改进。
  • \n
  • 考虑投资更快的存储。要么足以替换您现有的存储,要么使用较小的数量,然后您可以将其与bcache一起使用,以在功能上加快现有存储的速度。
  • \n
\n


sho*_*hok 7

如果您需要持久性,RAMDISK 不是正确的解决方案。

我强烈建议投资一对快速(即:企业级,具有断电保护)NVMe 磁盘来放入经典的 RAID1(镜像)阵列。


Cri*_*gie 7

我已经使用 AWS 临时磁盘完成了类似的操作,该磁盘速度非常快,但无法在断电/通电周期中幸存。

我们有一个“种子磁盘”,它是 GP2(现在是 GP3)的普通廉价 EBS 卷,它位于具有快速临时磁盘的 RAID1 中

我为 rc.local 创建了一个 bash 脚本,用于通过命令输出确定nvme list是否存在临时磁盘,并在适当的情况下将其加入到 raid 中。
在您的情况下,启动时必须创建 ramdisk,将其加入到现有的降级阵列中。

PROD pathservice1.taws ~ $ nvme list
Node             SN                   Model        Namespace Usage                 Format           FW Rev
---------------- --- ----------------------------- --------- -------------------- ---------------- --------
/dev/nvme0n1     123 Amazon Elastic Block Store          1   128.85 GB / 128.85 GB    512   B +  0 B   1.0
/dev/nvme1n1     234 Amazon Elastic Block Store          1   107.37 GB / 107.37 GB    512   B +  0 B   1.0
/dev/nvme2n1     345 Amazon Elastic Block Store          1   2.20   TB /  2.20  TB    512   B +  0 B   1.0
/dev/nvme3n1     456 Amazon EC2 NVMe Instance Storage    1   900.00 GB / 900.00 GB    512   B +  0 B   0
/dev/nvme4n1     567 Amazon EC2 NVMe Instance Storage    1   900.00 GB / 900.00 GB    512   B +  0 B   0
Run Code Online (Sandbox Code Playgroud)

最后两个是每个 900G 的临时磁盘。

  • 在 EBS 卷上使用“主要写入”选项。如果快速磁盘不存在或还没有这些块,它仍然会执行读取操作。一旦快速磁盘被填充(或“预热”),读取就会在那里发生。

好处是,对 mdX 设备的写入将通过有序的重新启动和断电而持续存在。意外的硬断电可能会导致写入丢失。

因此,这是一个糟糕的备份替代品 - 您仍然应该使用适合您的任何方法进行备份。

  • PSA:您可以通过使用 AWS EBS st1 或 sc1 作为种子磁盘来节省成本 - 但种子需要更长的时间。计算一下这种权衡对您是否有意义。 (2认同)
  • 哦,您可能可以通过“不”从“云”提供商处获取这些来节省“大量”资金。AWS/Azure/Google 都非常昂贵,而且你还要为流行词付出代价…… (2认同)