我想知道,如果分配的 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,但不想花太多时间思考我的行为的后果,这可能是一个本质上更安全的选择。
机器会崩溃。故事结局。(*)
系统管理员可以对所有 tmpfs 实例进行合理的大小限制。
tmpfs
很棒并且使“ramdisk”变得简单,但是要注意的一件事是它tmpfs
没有全局大小限制,而是每个已安装实例的大小限制。OOM kill 无法回收
tmpfs
. 最多可以换出,但前提是有足够的可用交换空间。所以,如果你在这里挂载一个
tmpfs
,那里挂载一个,这里挂载一个,那里挂载一个......并且每个都有几个千兆字节的限制而不是小尺寸,很容易使机器崩溃(或发送到无限交换-取消交换-reswap 循环)只需将它们全部填满即可。不幸的是
tmpfs
,默认为高达 50% 的 RAM(而不是10M
或足以满足许多任务的东西),并且默认为全局可写。因此,通常会看到三个或四个tmpfs
实例在填满后会占用 200% 的 RAM。任何普通用户都可能使系统崩溃。是时候拜访您
/etc/fstab
并给他们合理的限制了。(*)
你的例子实际上是最无害的。您正在编写零而不是随机数据,因此如果您正在进行一些简单的优化(相同的页面合并或 zswap),您可能仍然可以幸免于难。零可以通过其他方式压缩或优化掉。
你想写随机数据。那是不可优化的,它必须完整存储。
但是,写入随机数据仍然相对无害。你的交换将被填满,如果你有足够的,那就结束了。对于交换最好的情况是永远不会读回被交换的内容。
因此,您不仅要写作,还要阅读它。然后,即使您的 tmpfs 几乎没有被 ram 和 swap 覆盖,机器仍然会自行交换到死。