这个问题起源于同事之间关于通过将交换文件移动到 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
系统调用需要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;
}
Run Code Online (Sandbox Code Playgroud)
但是它们都不是由tmpfs实现的,相应的条目缺少这样的条目address_space_operations
:http : //lxr.free-electrons.com/source/mm/shmem.c?v=4.0#L3104
出于同样的原因,tmpfs 不能保持循环挂载,而且 ramfs 也不能工作(它没有bmap
调用)
那么,在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)