假设我们定义了以下内容/etc/fstab
tmpfs /data tmpfs size=90% 0 0
然后我们
mount -a
现在/data
是与tmpfs
以下场景可能会发生什么
/data
达到90%
RAM 内存(达到 90%)的情况tmpfs
是否意味着在这种情况下90%
将使用交换内存?
答案1
简短回答: 如果您的物理内存无法满足百分比部分(90%),最终将使用交换。当IO大于指定百分比时发生IO错误。
长答案: 该百分比代表您的内存部分(物理内存 + 交换分区或交换文件}。假设您有 1TiB DIMM (RAM) 并按照 Redhat 的建议设置交换 100GiB,理论上讲任何对 /data 超过 0.989 TiB 的 IO 都会发生IO 错误就像所有其他文件系统一样,在实践中,由于内存和交换空间正在被所有其他东西使用,所以要小心引起的死锁。如果内存过度增长,OOM 将无法清除内存。
这是我所说的证据,在我的笔记本电脑上执行:
写入 IO 之前的系统状态。
ceto@dell:~$ free total used free shared buff/cache available Mem: 8041716 2110100 3461592 208904 2470024 5464012 Swap: 2097148 0 2097148 ceto@dell:~$ cat /etc/fstab | grep data tmpfs /data tmpfs rw,nodev,nosuid,size=90% 0 0 ceto@dell:~$ mv rh/rhel-8.1-x86_64-dvd.iso /var/lib/libvirt/images/^C ceto@dell:~$ findmnt /data TARGET SOURCE FSTYPE OPTIONS /data tmpfs tmpfs rw,nosuid,nodev,relatime,size=7237548k ceto@dell:~$ df /data Filesystem 1K-blocks Used Available Use% Mounted on tmpfs 7237548 0 7237548 0% /data
我使用下面的脚本生成了 IO,该 IO 高于 /data 挂载路径的 90%。
ceto@dell:~$ cat deadlock.sh dd if=/dev/urandom of=/data/test.img bs=16M count=454 > deadlock.txt 2>&1 df /data >> deadlock.txt free >> deadlock.txt sleep 1 rm -rf /data/test.img sync /data
让我们生成 IO 并看看会发生什么
ceto@dell:~$ sudo sh deadlock.sh
在输出文件中我们看到发生了 IO 错误并且系统变得马虎
ceto@dell:~$ cat deadlock.txt dd: error writing '/data/test.img': No space left on device 442+0 records in 441+0 records out 7411249152 bytes (7.4 GB, 6.9 GiB) copied, 39.6605 s, 187 MB/s Filesystem 1K-blocks Used Available Use% Mounted on tmpfs 7237548 7237548 0 100% /data total used free shared buff/cache available Mem: 8041716 2284836 126108 5358092 5630772 139840 Swap: 2097148 2097084 64