在 Linux 上创建 RAM 磁盘

在 Linux 上创建 RAM 磁盘

我有一台 RAM 为 62GB 的机器,而主干只有 7GB,所以我想我应该创建一个 RAM 磁盘并在那里进行编译。我不是 Linux 专家。我在网上找到了创建 RAM 磁盘的说明:

mkfs -q /dev/ram1 8192

但我将8192更改为16777216,试图分配16GB的ram磁盘。

我收到以下错误:

mkfs.ext2: Filesystem larger than apparent device size.
Proceed anyway? (y,n) 

就在那时我感到害怕并被保释。

sudo dmidecode --type 17 | grep Size

节目

8x8192MB + 2048MB = 67584 MB

du/dev给出了804K

这是问题所在吗?我能克服这个/dev尺寸吗?

答案1

在 Linux 上创建 ram 磁盘的最佳方法是 tmpfs。它是一个位于 RAM 中的文件系统,因此不需要 ext2。您可以使用以下命令创建 16Gb 大小的 tmpfs:

mount -o size=16G -t tmpfs none /mnt/tmpfs

答案2

Linux 是非常有效利用 RAM。毫不奇怪,您几乎看不到 的加速tmpfs。读入内存的最大部分(因此能够减慢进程)是工具(编译器、汇编器、链接器),总而言之,make它们将在启动时加载到内存中,并且永远不会离开。剩下的就是读取源代码(写出结果不会减慢你的速度,除非内存严重受限)。同样,通用头文件将保留,只有用户的源代码需要阅读。这不太可能超过几兆字节。创建一个大的 RAMdisk(或者甚至大量使用tmpfs)可以很好地减慢速度(通过限制构建内存、RAMdisk 或上的文件)tmpfs 不能可以直接从那里使用)。

答案3

除了tmpfs和 之外ramfs,另一个选择是/dev/ram0块设备。在最新的 Ubuntu 版本中,默认情况下该设备不存在,但可以通过modprobe brd.

这种方法更具可预测性,因为它创建了一个真实的ext4文件系统并且永远不会超出您指定的限制。但它需要更多的设置步骤,并且 RAM 的使用效率较低。

使用 brd 内核模块 (/dev/ram0)

创建并初始化 4GB RAM 磁盘:

mkdir /ramdisk

modprobe brd rd_nr=1 rd_size=$((4 * 1048576))
mkfs.ext4 /dev/ram0
mount /dev/ram0 /ramdisk

rd_nr参数指定要创建多少个 RAM 磁盘(默认情况下创建 16 个,即/dev/ram0通过/dev/ram15)。参数rd_size大小为千字节。该$(( ... ))语法允许您在 shell 中进行算术运算。

要释放 RAM 磁盘,请将其卸载并删除brd内核模块:

umount /ramdisk
modprobe -r brd

里面创建块设备ramfs

或者,您可以在以下位置创建块设备ramfs

mkdir /ramdisk-storage /ramdisk
mount -t ramfs ramfs /ramdisk-storage

truncate -s 4G /ramdisk-storage/ramdisk.img
mkfs.ext4 /ramdisk-storage/ramdisk.img
mount /ramdisk-storage/ramdisk.img /ramdisk

truncate命令创建一个给定大小的空文件,以便按需初始化(即消耗内存)。

要取消分配 RAM 磁盘,请将其卸载并删除磁盘映像:

umount /ramdisk
rm /ramdisk-storage/ramdisk.img

tmpfs与和 的比较ramfs

尽管tmpfsramfs比使用块设备更有效,但以下是它们的一些缺点。

tmpfs可能会交换到磁盘。这样效率更高,但有时您可能需要纯 RAM 磁盘:

  • 您正在使用的文件是敏感的(例如来自加密分区的文件)。
  • 您正在进行性能测试,并且不希望磁盘 I/O 成为一个因素(SSD 写入时间可能会有很大差异)。
  • 您正在解压一个大文件,并且不想磨损您的 SSD。

ramfs易于设置,一旦删除文件即可回收空间,并且更有效地使用 RAM(系统不会缓冲文件,因为它知道它们位于 RAM 中)。但它也有其自身的缺点和惊喜:

  • df实用程序不报告空间使用情况:

    root@cello-linux:~# df -h /ramdisk
    Filesystem      Size  Used Avail Use% Mounted on
    ramfs              0     0     0    - /ramdisk
    
  • 没有大小限制参数。如果您在 ramdisk 中放入太多内容,您的系统将会挂起。

  • 当您最意想不到的时候,稀疏文件可能会变得不稀疏。今天早上,我将一个 VM 映像(150G,但磁盘上使用了 49G)复制到ramfs(我有 128G 的 RAM)。那行得通。但是当我复制的时候到达ramfs目的地后,我的系统变得没有响应。该cp实用程序显然填补了漏洞,但不在写入时。

tmpfs和的ramfs行为可能与真实文件系统不同ext4。在 RAM 中创建块设备并初始化它ext4可以避免这种情况。

更深入的比较:https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt

答案4

您可以安装ramfs文件系统,将项目复制到其中并从那里开始工作。这可以保证您的输入文件被加载到 RAM 中,并且不会从速度慢得多的磁盘驱动器中重新读取它们。然而,正如您所发现的,这通常不是一个有用的策略。您已经获得了完全相同的好处。

Ramfs 是一个非常简单的文件系统,可导出Linux的磁盘缓存机制(页面缓存和目录缓存)作为动态调整大小的基于 RAM 的文件系统。

--https://github.com/torvalds/linux/blob/v4.18/Documentation/filesystems/ramfs-rootfs-initramfs.txt

您已经可以相信您的输入文件在第一次被读取时就已缓存在 RAM 中。您的输出文件也会被缓存,因此您不必等待它们被写入磁盘。

对于可以缓存的数量、缓存的时间等没有人为限制。只有在内存填满后,缓存才会开始被删除。首先删除哪个缓存是通过极其复杂的算法来选择的。第一个近似值,我们将其描述为“最近最少使用”。看Linux 内核中使用哪些页面替换算法来进行操作系统文件缓存?

请注意,您的文本编辑器将显式地fsync()将文件保存到磁盘。

如果您运行涉及 的程序测试fsync(),则在文件系统中运行这些测试ramfs可能会加快速度。另一种策略是尝试使用fsync()/eatmydata禁用nosync.so

其他一些操作系统可能有特定的限制,可以使用 ramdisk 绕过这些限制。一方面,缺乏任何文件缓存是 ramdisk 流行的原因操作系统

临时文件系统

tmpfs与 的工作原理相同ramfs,只是它可以使用交换空间(如果有的话)。也就是说,如果您需要 RAM 来做其他事情,最近最少使用的算法可能会从 tmpfs 中选择数据块并将它们交换到磁盘。

大多数人坚持使用tmpfs,因为它还可以让您限制总大小,并显示命令中正确使用的空间df。我不确定为什么存在这种差异。大小限制可以tmpfs防止您意外填满整个 RAM 并基本上杀死您的系统。它默认为 RAM 的一半。

写入速度变慢的其他原因

以上是根据您的情况进行的简化。在您的情况下,对文件的写入不需要等待磁盘。然而,在某些写入情况下确实如此。请参阅优秀的博客文章为什么缓冲写入有时会停止。最令人惊讶的案例是 Linux 最近的一项名为“稳定页面写入”的更改。

相关内容