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


11

这个问题源自同事之间的一个玩笑,内容是关于通过将交换文件移动到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我遇到的错误吗?

再次强调一下,我不希望这是解决实际问题的解决方案。我想这只是一个有趣的实验。


您在寻找zram吗?
弗罗斯特斯2015年

Answers:


1

因此,在linux或unix(我对任何解决方案都感兴趣)上,您能以某种方式在驻留在ram中的文件/分区上设置交换吗?

当然。在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%

4年后移动“接受的答案”对勾是一个艰难的决定。这个答案表明有办法!mdconfig(8)包括一条注释,指出该-o reserve选项“是使系统崩溃的非常简单的方法”。它还指出,可以将类型设置为swap允许非常有趣的情况,即系统将内存页面移入本身驻留在内存中的交换中!-o force对于像我这样的假人,甚至可以选择省略“额外的健全性检查”。阅读这篇文章时笑得很开心。
大大超人

10

这不可能。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;
}   

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

出于相同的原因,tmpfs无法容纳循环挂载,并且ramfs也将不起作用(它没有bmap调用)


3

通过此Q&A /superuser/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分区,并且在下次访问该文件时必须从磁盘读取该文件。

在您的方案中,这几乎是不可能的。

可能与工作ramfs,寿-不存在这个问题。


是的-将tmpfs分区设置为交换会开始,并且在计算机开始交换时会出现无限循环。
dr_

1

您可以轻松避免功能缺失的问题并交换到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和swap空间,实际上,与OpenSolaris相似的想法(交换为压缩的zvol)导致类似的结果。


@Jesse_b,在该文件上执行绑定而不是循环挂载会有所不同吗?
rjt

@rjt:不确定。我没有写答案,而只是编辑了答案。
jesse_b

@unisol,交换文件是否超出了预期范围。填满磁盘空间
rjt

1
实际在哪里使用RAM?看起来它在/ tmp /上创建了一个文件,该文件在计算机上重新启动后仍然存在。
rjt

打算在/ tmp中安装tmpfs(这对“重新启动后什么都没有留下”很有用,并且经常在嵌入式设置中使用,但是如果RAM不足并且当某些东西不适合/ tmp时不愉快,则很危险) -就像mc解压缩了几档存档。主题启动程序无法使用基于RAM的文件系统获取交换文件-因此,我仅在其中创建一个文件,将其格式化为具有必需功能的任何FS(即ext2),然后在该FS上创建交换。多余的圈圈-但目标得以实现。
unisol
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.