背景:コンピュータクラスタが存在し、ノードが割り当てられると、ジョブは要求されたサイズのtmpディレクトリを取得します。しかし、要求された合計ディスク容量が利用可能なスペースよりも大きい場合、同じシステムに2つのタスクを送信できることがわかりました。エラーを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の2つのファイルを作成します。
# 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
。 (Frost Schutzがコメントでこれを言及しました。.)
これマンページには次の内容があります。-E discard
:
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
失敗しました。