我有一台 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
尽管tmpfs
和ramfs
比使用块设备更有效,但以下是它们的一些缺点。
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 最近的一项名为“稳定页面写入”的更改。