累积 tmpfs 超出可用虚拟内存

累积 tmpfs 超出可用虚拟内存

我想知道,如果分配的 tmpfs 空间多于物理内存,并且它们已被填满,会发生什么。


更详细:

假设我有 4GB RAM、4GB 交换空间。

mount -o size=4G -t tmpfs tmpfs /mnt1
mount -o size=4G -t tmpfs tmpfs /mnt2
mount -o size=4G -t tmpfs tmpfs /mnt3

据我了解,没有问题,因为这些设备实际上并不分配它们从一开始就分配的内存。

现在我开始写这些:

cat /dev/zero >/mnt1/bla &
cat /dev/zero >/mnt2/bla &
cat /dev/zero >/mnt3/bla &

和...


问题:

我想知道系统应该如何处理这个问题?

我没有找到任何东西,但是当我多次挂载 tmpfs 时,我是否会在幕后一遍又一遍地挂载相同的设备,或者创建不同的、完全独立的设备实例?

我是否以某种方式阻止了系统崩溃,或者我可以自由地这样做吗?

当我将 tmpfs 分配给 /tmp 时,我开始思考它的根本原因:

  1. 一种方法是直接安装,
  2. 另一种是在中创建一个文件/dev/shm,然后绑定安装它。

如果没有限制分配 tmpfs 空间,2. - 绑定安装 - 如果我想广泛使用 tmpfs,但又不想花太多时间思考我的行为的后果,那么这可能是一个本质上更安全的选择。

答案1

机器会崩溃。故事结局。 (*)

系统管理员应为所有 tmpfs 实例提供合理的大小限制。

tmpfs很棒,使“ramdisk”变得简单,但需要注意的一件事是,它tmpfs没有全局大小限制,但有每个已安装实例的大小限制。

OOM 终止无法回收tmpfs.最多可以将其换出,但前提是有足够的可用交换空间。

因此,如果你tmpfs在这里安装一个,那里安装另一个,这里又安装一个,那里又安装一个......并且每个都有几千兆字节的限制而不是小尺寸,很容易使机器崩溃(或发送到无限交换-取消交换) -reswap 循环)只需将它们全部填满即可。

不幸的是,tmpfs默认为高达 50% 的 RAM(而不是10M或足以满足许多任务的东西),并且默认为全局可写。因此,经常会看到三四个tmpfs实例在 RAM 已满的情况下占用 200% 的内存。任何普通用户都可能导致系统崩溃。

是时候拜访您/etc/fstab并给予他们理智的限制了。


(*)

现在我开始写这些:

cat /dev/zero >/mnt1/bla &

你的例子实际上是最无害的。您正在写入零而不是随机数据,因此如果您进行一些简单的优化(同一页面合并或 zswap),您可能仍然可以幸存。可以通过其他方式压缩或优化零。

您想写入随机数据。这是不可优化的,它必须完整存储。

但是,写入随机数据仍然是相对无害的。你的交换空间将会被填满,如果你有足够的空间,那就结束了。对于交换来说,最好的情况是永远不会读回被换出的内容。

因此,您不仅会想写,还想读。那么即使你的 tmpfs 几乎没有被 ram 和 swap 覆盖,机器仍然会自行交换到死。

相关内容