这个问题源于同事之间的一个笑话,内容是通过将交换文件移动到 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_operations
:http://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%