交换 tmpfs(显然是个坏主意,但是可能吗?)

交换 tmpfs(显然是个坏主意,但是可能吗?)

这个问题源于同事之间的一个笑话,内容是通过将交换文件移动到 tmpfs 来提高性能。显然,即使这是可能的,但这也不是一个好主意。我只想知道,这能做到吗?

我目前使用的是 Ubuntu 14.04,但我想大多数 Linux/Unix 机器的过程都是相似的。这就是我正在做的:

> mkdir /mnt/tmp
> mount -t tmpfs -o size=10m tmpfs /mnt/tmp
> dd if=/dev/zero of=/mnt/tmp/swapfile bs=1024 count=10240
> chmod 600 /mnt/tmp/swapfile
> mkswap /mnt/tmp/swapfile
# So far, so good!

> swapon /mnt/tmp/swapfile
swapon: /mnt/tmp/swapfile: swapon failed: Invalid argument

那么,无论是在 Linux 还是 Unix 上(我对任何解决方案都感兴趣),您能否以某种方式在 RAM 中的文件/分区上设置交换?有没有办法解决Invalid argument我上面遇到的错误?

再次强调,我并不期望这能解决现实世界的问题。我想这只是一个有趣的实验。

答案1

这应该是不可能的。swapon系统调用需要readpage文件bmap系统实现的(间接)调用:

http://lxr.free-electrons.com/source/mm/swapfile.c?v=4.0#L2412

if (!mapping->a_ops->readpage) {
    error = -EINVAL;
    goto bad_swap;
}   

但它们都没有被实现临时文件系统,相应的 中缺少这样的条目address_space_operationshttp://lxr.free-electrons.com/source/mm/shmem.c?v=4.0#L3104

出于同样的原因,tmpfs 无法保存循环挂载,ramfs 也无法工作(它没有bmap调用)

答案2

从这个问答https://superuser.com/questions/539287/swapon-failed-invalid-argument-on-a-linux-system-with-btrfs-filesystem(原来引用的网站没有响应):

因此“无效参数”应理解为“您的文件系统不支持交换文件”

我怀疑不兼容的原因是“循环依赖”。从这篇文章:http://www.jamescoyle.net/knowledge/951-the-difference- Between-a-tmpfs-and-ramfs-ram-disk:

ramfs 和 tmpfs 之间的这两个区别使 tmpfs 更易于管理,但这也是一个主要缺点; tmpfs 可能使用 SWAP 空间。如果您的系统耗尽物理 RAM,则 tmpfs 分区中的文件可能会写入基于磁盘的 SWAP 分区,并且在下次访问该文件时必须从磁盘读取。

在你的场景中这几乎是不可能的。

可能与 , tho 一起工作ramfs- 没有这个问题。

答案3

您可以轻松避免缺少函数的问题并交换到 tmpfs,尽管有点间接:

dd if=/dev/zero bs=1M of=/tmp/swapfs count=128
chmod 0600 /tmp/swapfs
mkfs.ext2 /tmp/swapfs
mount -o loop /tmp/swapfs /mnt
dd if=/dev/zero bs=1M of=/mnt/swap
mkswap /mnt/swap
swapon /mnt/swap

与 zswap 结合起来,它看起来像是一个很棒的“内存扩展器”解决方案,直到我的 RasPi4 几乎完全冻结(ssh 控制台冻结,X 冻结,chrome 中的 YouTube 持续通话几分钟并冻结,但系统正在回复 ping,并且看门狗没有响应)通过 ssh 启动(在此之前)并没有做任何有用的事情 - 似乎有足够的可用 RAM 和交换空间,事实上,与 OpenSolaris 类似(交换到压缩的 zvol)导致类似的结果。

答案4

那么,在linux或unix上(我对任何解决方案都感兴趣),你能以某种方式在内存中的文件/分区上设置交换吗?

当然。在 FreeBSD 上:

# swapinfo -h
Device          1024-blocks     Used    Avail Capacity
/dev/mirror/swap.eli     4194300       0B     4.0G     0%

这表明目前我有一个具有镜像冗余的 4G 加密交换分区。我将添加另外 4G 非冗余、非加密交换:

首先创建一个 4G RAM 支持的“内存磁盘”( md) 设备:

# mdconfig -a -t malloc -s 4g; mdconfig -lv
md0
md0     malloc   4096M  -

然后告诉我swapon将其添加到可用交换设备池中,并swapinfo确认我现在有 8G 交换空间:

# swapon /dev/md0; swapinfo -h
Device          1024-blocks     Used    Avail Capacity
/dev/mirror/swap.eli     4194300       0B     4.0G     0%
/dev/md0            4194304       0B     4.0G     0%
Total               8388604       0B     8.0G     0%

相关内容