如何在没有 tmpfs 的 Linux 中创建可交换的内存块设备?

如何在没有 tmpfs 的 Linux 中创建可交换的内存块设备?

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 磁盘的用户空间实现确实可以轻松调整和自定义。如果您的工作负载可以从中受益,您甚至可以实现重复数据删除。(当前实现不进行重复数据删除)。

相关内容