ext4ボリューム内のこれらのファイルが断片化されるのはなぜですか?


19

ext4欠陥や不良セクタのない(磁気)ハードドライブに900GBのパーティションがあります。空のlost+foundディレクトリを除いて、パーティションは完全に空です。パーティションは、予約済みファイルシステムブロックの数を1%に設定したことを除いて、デフォルトのパラメーターを使用してフォーマットされました。

〜を使用xubuntu-15.04-desktop-amd64.isoして、パーティションのマウントポイントディレクトリに〜900MBのファイルをダウンロードしましたwget。ダウンロードが完了すると、ファイルが4つのフラグメントに分割されていることがわかりました。

filefrag -v /media/emma/red/xubuntu-15.04-desktop-amd64.iso
Filesystem type is: ef53
File size of /media/emma/red/xubuntu-15.04-desktop-amd64.iso is 1009778688 (246528 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..   32767:      34816..     67583:  32768:            
   1:    32768..   63487:      67584..     98303:  30720:            
   2:    63488..   96255:     100352..    133119:  32768:      98304:
   3:    96256..  126975:     133120..    163839:  30720:            
   4:   126976..  159743:     165888..    198655:  32768:     163840:
   5:   159744..  190463:     198656..    229375:  30720:            
   6:   190464..  223231:     231424..    264191:  32768:     229376:
   7:   223232..  246527:     264192..    287487:  23296:             eof
/media/emma/red/xubuntu-15.04-desktop-amd64.iso: 4 extents found

これがwget何らかの形で関係しているのではないかと考えて、パーティションからISOファイルを削除し、再び空にしてv1.mp4から、を使用して〜700MBファイルをパーティションにコピーしましたcp。このファイルも断片化されていました。次の3つのフラグメントに分割されました。

filefrag -v /media/emma/red/v1.mp4
Filesystem type is: ef53
File size of /media/emma/red/v1.mp4 is 737904458 (180153 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..   32767:      34816..     67583:  32768:            
   1:    32768..   63487:      67584..     98303:  30720:            
   2:    63488..   96255:     100352..    133119:  32768:      98304:
   3:    96256..  126975:     133120..    163839:  30720:            
   4:   126976..  159743:     165888..    198655:  32768:     163840:
   5:   159744..  180152:     198656..    219064:  20409:             eof
/media/emma/red/v1.mp4: 3 extents found

なぜこうなった?そして、それを防ぐ方法はありますか?私ext4は断片化に耐性があると思っていました。代わりに、ボリュームの残りの部分がすべて使用されていない場合、単独のファイルをすぐに断片化することに気付きました。これは、両方のより悪いように思わFAT32NTFS


4
どんな状況でこれが問題になるか想像してみて、空っぽになりました。
グレッグヒューギル

4
@GregHewgill:異常だと思ったので問題になりました。今では、それは正常であり、問​​題ではないことがわかっています。
EmmaV

回答:


17

900mbファイルの3つまたは4つのフラグメント非常に優れています。断片化は、そのサイズのファイルに100個以上の断片がある場合に問題になります。fatやntfsがこのようなファイルを数百個に断片化することは珍しくありません。

ブロックグループの最大サイズは128 MBであるため、一般的に少なくとも古いext4ファイルシステムではそれよりも良く見えません。次のブロックグループ。flex_bgと呼ばれる最近のext4機能は、これらのテーブルの多くの(通常16の)ブロックグループの価値をまとめてパックすることを可能にします。使用されていません。

tune2fs -lファイルシステムがフォーマットされたときに有効になった機能を確認するために使用できます。


とても興味深い。すべてのiノードテーブルなどがボリュームの先頭にあると想定しました。
EmmaV

1
@EmmaVは、参照するデータに比較的近いディスク全体にそれらを配布し、シークの短縮とディスクアクセスの高速化を実現します:)
ホッブズ

10

私は本当に答えることはできませんが、これは役立つかもしれないと思います:

各フラグメントのサイズが最大で32768ブロックであることに注意してください(2の累乗は、何かが進行中であることを示すフラグを立て、また、何かを探すためのヒントを提供します)。

また、注目に値するのは、エクステント間のこれらの物理的なオフセットが互いに非常に近いことです。

From:Ext4 Disk Layout

ext4ファイルシステムは、一連のブロックグループに分割されます。断片化によるパフォーマンスの問題を軽減するために、ブロックアロケーターは、各ファイルのブロックを同じグループ内に維持しようと非常に努力し、シーク時間を短縮します。ブロックグループのサイズはで指定されますがsb.s_blocks_per_group blocks、8 *として計算することもできblock_size_in_bytesます。デフォルトのブロックサイズが4KiBの場合、各グループには、長さが128MiBの32,768ブロックが含まれます。

そしてさらに下に:

ext4がフラグメンテーションに対処するために使用する最初のツールは、マルチブロックアロケーターです。ファイルが最初に作成されると、ブロックアロケーターは8KiBのディスクスペースをファイルに投機的に割り当てます[...] ext4が使用する2番目の関連するトリックは遅延割り当てです。このスキームでは、ファイルの書き込みを吸収するためにより多くのブロックが必要になると、ファイルシステムはすべてのダーティバッファがディスクに書き出されるまでディスク上の正確な配置を決定しません。絶対に必要になるまで(コミットタイムアウトに達するか、sync()が呼び出されるか、カーネルがメモリ不足になるまで)特定の配置にコミットしないことにより、ファイルシステムがより適切な場所を決定できることが期待されます。

したがって、アロケータは、ブロックグループ(32Kブロック)内のデータの局所性のみを考慮し、ブロックグループが互いに隣接していることは考慮しないと思います。


あなたが最初に出した引用は私の質問に答えます。
エマV

1
エクステント記述子がカバーできる最大長であるため、各エクステントには最大32kブロックがあります。エクステントはフラグメントではありません。エクステントのいくつかの物理ブロックが直前のエクステントのすぐ後に続くことに気付いた場合は、フラグメントを構成しないでください(6エクステントと3フラグメント)。
-psusi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.