背景:我们有一个计算机集群,在节点分配时,作业会获取自己所请求大小的 tmp 目录。但我注意到我可以将两个作业发送到同一台机器,其请求的总磁盘空间大于可用空间。我将该错误追踪到fallocate
和mkfs.ext4
。
在具有 1.1T 可用磁盘空间的测试节点/计算机上,我创建虚拟磁盘来挂载 tmp 目录。使用fallocate
和mkfs.ext4
:
# fallocate -l 900G /tmp/disk-test1
# /sbin/mkfs.ext4 -F /tmp/disk-test1
# fallocate -l 900G /tmp/disk-test2
# /sbin/mkfs.ext4 -F /tmp/disk-test2
创建两个文件(看起来)大小均为 900G
# ll --block-size=G /tmp/
...
-rw-r--r--. 1 root root 900G Jul 4 14:03 disk-test1
-rw-r--r--. 1 root root 900G Jul 4 14:03 disk-test2
...
并查看可用磁盘空间
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg.01-lv_root 1.1T 8.6G 1.1T 1% /
...
/tmp 目录:
# df -h /tmp
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg.01-lv_root 1.1T 8.6G 1.1T 1% /
我不希望这种事发生。如果没有足够的剩余空间,则不得创建虚拟磁盘,并且一旦安装,对虚拟磁盘的写入应受到其大小的限制。
这里发生了什么?
答案1
是的,我可以重现:
# df -h .
Filesystem Size Used Avail Use% Mounted on
/dev/root 30G 14G 14G 51% /
# fallocate -l 8G test1.disk
# df -h .
Filesystem Size Used Avail Use% Mounted on
/dev/root 30G 22G 5.8G 80% /
# mkfs -text4 test1.disk
mke2fs 1.43.4 (31-Jan-2017)
Discarding device blocks: done
Creating filesystem with 2097152 4k blocks and 524288 inodes
...
# df -h .
Filesystem Size Used Avail Use% Mounted on
/dev/root 30G 14G 14G 51% /
当文件被 d 时,磁盘使用率上升fallocate
,但在 d 后又下降mkfs
。请注意“丢弃设备块:完成”在 的输出中mke2fs
。 (弗罗斯特舒茨在评论中提到了这一点.)
尝试在 mkfs 时丢弃
块(最初丢弃块对于固态设备和稀疏/精简配置存储很有用)。 ...这是默认设置。
要做nodiscard
相反的事情,所以让我们尝试一下:
# df -h .; fallocate -l 8G test2.disk; mkfs -text4 -Enodiscard test2.disk; df -h .
Filesystem Size Used Avail Use% Mounted on
/dev/root 30G 14G 14G 51% /
mke2fs 1.43.4 (31-Jan-2017)
Creating filesystem with 2097152 4k blocks and 524288 inodes
...
Filesystem Size Used Avail Use% Mounted on
/dev/root 30G 22G 5.9G 79% /
现在另一个fallocate -l 8G
失败了。