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

vas*_*man 12 linux swap 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
Run Code Online (Sandbox Code Playgroud)

因此,在 linux 或 unix(我对任何解决方案都感兴趣)上,您能否以某种方式在驻留在 ram 中的文件/分区上设置交换?有没有办法解决Invalid argument我上面的错误?

再次强调,我不希望这是对现实世界问题的解决方案。只是一个有趣的实验,我猜。

mya*_*aut 11

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

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

if (!mapping->a_ops->readpage) {
    error = -EINVAL;
    goto bad_swap;
}   
Run Code Online (Sandbox Code Playgroud)

但是它们都不是由tmpfs实现的,相应的条目缺少这样的条目address_space_operationshttp : //lxr.free-electrons.com/source/mm/shmem.c?v=4.0#L3104

出于同样的原因,tmpfs 不能保持循环挂载,而且 ramfs 也不能工作(它没有bmap调用)


Jim*_* L. 1

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

当然。在 FreeBSD 上:

# swapinfo -h
Device          1024-blocks     Used    Avail Capacity
/dev/mirror/swap.eli     4194300       0B     4.0G     0%
Run Code Online (Sandbox Code Playgroud)

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

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

# mdconfig -a -t malloc -s 4g; mdconfig -lv
md0
md0     malloc   4096M  -
Run Code Online (Sandbox Code Playgroud)

然后告诉我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%
Run Code Online (Sandbox Code Playgroud)