
断片化は、HDDのディレクトリツリーをナビゲートするときに不要な検索をたくさん生成するようです。
# stat -c %F 00 01 02
directory
directory
directory
# filefrag -v 00 01 02
Filesystem type is: ef53
File size of 00 is 12288 (3 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 0: 428351942.. 428351942: 1:
1: 1.. 2: 428352760.. 428352761: 2: 428351943: last,eof
00: 2 extents found
File size of 01 is 12288 (3 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 0: 428351771.. 428351771: 1:
1: 1.. 2: 428891667.. 428891668: 2: 428351772: last,eof
01: 2 extents found
File size of 02 is 12288 (3 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 0: 428351795.. 428351795: 1:
1: 1.. 2: 428352705.. 428352706: 2: 428351796: last,eof
02: 2 extents found
e4defragはデフラグできません
# e4defrag -v 00
ext4 defragmentation for directory(00)
[1/116] "00"
File is not regular file [ NG ]
それでは、ディレクトリの最適化はどうなりますか?内容ではなく、ディレクトリ自体です。これらのディレクトリは使用中であるため、通常のファイルの最適化が使用を妨げないように原子的に実行する必要があります。
答え1
ディレクトリインデックス作成のためのオンラインデフラグツールがないようで、オフラインデフラグも役に立たないようだったので、ディレクトリツリーを再帰的に再構築する必要がありました。
私は小さなツールを書いた(デフラグディレクトリ)この目的のために。残念ながら、この方法を使用するには、デフラグ中にディレクトリツリーを使用するアプリケーションを削除する必要があるため、数百万のファイルを操作するのに時間がかかることがあります。
答え2
空き領域がある場合は、同じデバイスに新しいディレクトリの並列ツリーを作成し、ファイルをここにハードリンクしてから、ヘッドディレクトリの名前を変更して再起動するか、別のアプリケーションを終了して元のディレクトリツリーを削除できます。私たちは、変更をテストしたり、実行中の本番の外にソフトウェアバージョンをインストールするために、最小限のファイルスペースでこのようなレプリケーションツリーを作成したりしました。
最も若いファイルは一時ファイルである可能性が高いため、各ディレクトリディレクトリを最初にビルドしてから(ツリーナビゲーションを高速化)、最も古いファイルを最初にビルドできます。
フラットファイルとディレクトリ以外のファイル形式では、これがどのように機能するのかわかりません。私はシンボリックリンク自体がハードリンクまたは名前付きパイプであると予想します。しかし、デバイスはどうですか?もちろん、カーネルテーブルを反映する/prodや/devなどの偽のツリーはLinuxで禁止されていると確信しています。