modprobe brd rd_nr=1 rd_size=$SizeInKB
在 Linux 中,可以通过(创建未压缩的/dev/ram0
) 或modprobe zram && echo $SizeInBytes >| /sys/block/zram0/disksize
(创建压缩的)创建 ramdisk /dev/zram0
。
这些类型的 ramdisk 都无法分页到交换设备,因此只能使用物理内存的一小部分。
要制作一个可交换的内存块设备,使其能够比物理内存更大,可以使用
mkdir -p /run/ramfs && mount -t tmpfs -o size=0 ramfs /run/ramfs && \
truncate --size $SizeInBytes /run/ramfs/ramfs && losetup -f && losetup -f /run/ramfs/ramfs
。
这是未压缩的,但可以与 结合使用zswap
以使其压缩(至少是其内存中的部分)。但这涉及文件系统和回送设备
的开销。tmpfs
有没有更好的方法来制作可分页/可交换(可能压缩)的内存块设备,以避免块层以下文件系统的开销?
答案1
一种方法是(不确定它是否比你描述的方法更好)使用我编写的这个基于 NBD 的 RAM 磁盘. 你可以像这样使用它:
$ nbdkit -U /tmp/sock memory 10G
# nbd-client -unix /tmp/sock /dev/nbd0
此 RAM 磁盘以稀疏数组的形式存储,因此其大小可以是任意大小,最大可达 8 EB。如果您将 allocator=zstd 添加到命令行,则它将被压缩。
这肯定有优点也有缺点。虽然对于正常工作负载来说性能相当不错,但会增加一些开销。拥有 RAM 磁盘的用户空间实现确实可以轻松调整和自定义。如果您的工作负载可以从中受益,您甚至可以实现重复数据删除。(当前实现不进行重复数据删除)。