![累积 tmpfs 超出可用虚拟内存](https://linux22.com/image/147423/%E7%B4%AF%E7%A7%AF%20tmpfs%20%E8%B6%85%E5%87%BA%E5%8F%AF%E7%94%A8%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98.png)
我想知道,如果分配的 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 时,我开始思考它的根本原因:
- 一种方法是直接安装,
- 另一种是在中创建一个文件/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 覆盖,机器仍然会自行交换到死。