
ファイルシステムの断片化(ファイルシステムの劣化とも呼ばれる)は、ファイルを連続していないブロックに格納するファイルシステムの特性です。これはデータ断片化の特殊なケースです。ファイルシステムの断片化は、ディスクストレージ(回転式ストレージメディア)のシーク時間に悪影響を与え、スループットを低下させます。断片化は、ファイルを連続した領域として再編成することで解消できます。このプロセスはデフラグメンテーションと呼ばれます。
ソリッドステートドライブ(SSD)は機械的にシークしないため、非シーケンシャルアクセスはディスクドライブよりも桁違いに高速で、断片化の問題が大幅に軽減されます。実際、SSDのデフラグは不要な書き込みと消去操作によってドライブの寿命を縮める可能性があるため、デフラグしないのがベストプラクティスです。 [ 1 ]
パーティション上にファイルシステムが最初に初期化されると、内部構造はごくわずかで、それ以外は連続した空き領域となります。[ a ]これは、ファイルシステムが新しく作成されたファイルをパーティション上のどこにでも配置できることを意味します。作成後しばらくの間は、ファイルはほぼ最適な状態で配置されます。オペレーティングシステムやアプリケーションがインストールされたり、アーカイブが解凍されたりすると、個々のファイルが順番に配置され、関連するファイルが互いに近い位置に配置されます。
既存ファイルが削除または切り詰められると、新しい空き領域が作成されます。既存ファイルに追記する場合、別のファイルが既に割り当てられている可能性があるため、ファイルの終了位置から正確に書き込みを再開することは多くの場合不可能です。そのため、新しい断片を割り当てる必要があります。時間が経つにつれて、同じ要因が継続的に存在すると、空き領域と頻繁に追記されるファイルは断片化が進みます。空き領域が短くなると、ファイルシステムは新しいファイルを連続して割り当てることができなくなり、断片に分割する必要が生じます。これは、ファイルシステムが満杯になり、大きな連続した空き領域が利用できない場合に特に顕著です。

以下の例は、本来複雑なテーマを簡略化したものです。次のシナリオを考えてみましょう。新しいディスクに、A、B、C、D、Eという名前の5つのファイルが、この順序で連続して保存されています。各ファイルは10ブロックの領域を使用しています(ここではブロックサイズは重要ではありません)。ディスクの残りの領域は1ブロックの空き領域です。したがって、ファイルEの後に、さらにファイルを作成して保存することができます。
ファイル B が削除されると、10 ブロックの空き領域が新たに作成され、ディスクが断片化されます。空き領域はそのまま残され、後で使用できるものとしてマークされ、必要に応じて再び使用されます。[ b ]ファイルシステムは削除直後にディスクをデフラグすることもできますが、そうすると予測できないタイミングで深刻なパフォーマンス低下が発生します。
これで、7ブロックの領域を必要とするFという新しいファイルを、以前ファイルBが格納されていた空き領域の最初の7ブロックに配置することができ、その後の3ブロックは引き続き使用可能になります。さらに、3ブロックしか必要としないGという新しいファイルを追加する場合は、Fの後、Cの前に配置することができます。
その後、Fの直後の領域が占有されているため、Fを拡張する必要が生じた場合、ファイルシステムには次の3つの選択肢があります。
2番目の方法はパフォーマンス上の理由から現実的ではない可能性が高く、3番目の方法もファイルサイズが非常に大きい場合は同様に現実的ではありません。3番目の方法は、新しいファイルを格納するのに十分な大きさの連続した空き領域が1つもない場合は不可能です。したがって、通常の方法は、別の場所にエクステントを作成し、新しいエクステントを古いエクステントに連結することです。
ファイルFの末尾に追加されたデータは、同じエクステント内に含まれます。しかし、データ量が多すぎて最後のエクステントの後に空き領域がなくなると、別のエクステントを作成する必要があり、これを繰り返します。最終的に、ファイルシステムには多くの場所に空きセグメントができ、一部のファイルが複数のエクステントにまたがる場合があります。そのようなファイル(またはすべてのファイル)へのアクセス時間が極端に長くなる可能性があります。
初期のファイルシステムの中には、ファイルの断片化に対応していないものがありました。その一例が、BBC Microで使用されていたAcorn DFSファイルシステムです。ファイルの断片化に対応していないため、 「拡張できません」というエラーメッセージが表示されることがあり、ディスクに十分な空き容量があっても、ユーザーはファイルを保存できないことがよくありました。
DFSは非常にシンプルなディスク構造を採用しており、ディスク上のファイルは長さと開始セクタのみで識別されていました。つまり、すべてのファイルは連続したセクタのブロックとして存在しなければならず、断片化は不可能でした。上記の表の例を用いると、このようなシステムでは、ステップ5でファイルFを拡張しようとすると、「拡張できません」というエラーメッセージが表示されて失敗します。ディスクにどれだけの空き容量が残っていても、データファイルを拡張するために利用できる容量はなかったのです。
当時のエラー処理の標準は原始的で、いずれにしても、BBC Micro の限られたメモリに詰め込まれたプログラムでは、エラーを適切に処理しようとしてスペースを無駄にする余裕はほとんどありませんでした。その代わりに、ユーザーは「拡張できません」というメッセージとともにコマンド プロンプトに戻され、ファイルにまだ追加されていなかったすべてのデータが失われることになります。この問題は、事前にディスクの空き容量を確認するだけでは解決できませんでした。ディスクに空き容量があっても、ディスク カタログに表示される数値を分析しないと、最大の連続した空き領域のサイズがすぐにわからないため、ユーザーは気づかないままでした。さらに、ほとんどすべての DFS ユーザーは、このエラーの影響を受けないカセット ファイル ストレージを以前に使用していました。フロッピー ディスクシステムへのアップグレードは高価なアップグレードであり、アップグレードが予告なしにデータ損失を引き起こす可能性があるというのは衝撃でした。[ 2 ] [ 3 ]
ファイルシステムの断片化は、いくつかのレベルで発生する可能性があります。
個々のファイルの断片化とは、単一のファイルが複数の断片(エクステントベースのファイルシステムではエクステントと呼ばれる)に分割された状態を指します。ディスクファイルシステムは個々のファイルを連続した状態に保つよう努めますが、パフォーマンスに大きな悪影響を及ぼさずにこれを実現することは容易ではありません。ファイルシステムのチェックツールやデフラグツールは、通常、「断片化率」という統計情報にのみファイルの断片化を考慮します。
空き領域(未割り当て領域)の断片化は、ファイルシステム内に新しいファイルやメタデータを書き込める未使用領域が複数存在する場合に発生します。不要な空き領域の断片化は、一般的にファイルの削除や切り捨てによって発生しますが、ファイルシステムによっては、近くのファイルの拡張を容易にするために、意図的に空き領域の断片(「バブル」)を挿入することもあります(断片化の防止については後述)。
ファイル分割(関連ファイル断片化、またはアプリケーションレベル(ファイル)断片化とも呼ばれる)とは、関連ファイル間の参照の局所性(記憶媒体内)の欠如を指します。前述の 2 種類の断片化とは異なり、ファイル分散は特定のアプリケーションのアクセスパターンに大きく依存するため、はるかに曖昧な概念です。そのため、客観的に測定または推定することは非常に困難です。しかし、最も頻繁にアクセスされるファイルは、1 秒あたりの利用可能なディスクスループットに比べて小さい傾向があることが研究でわかっているため、おそらく最も重要な種類の断片化と言えるでしょう。[ 4 ]
関連ファイルの断片化を回避し、参照の局所性(この場合はファイル連続性と呼ばれる)を向上させるには、アプリケーションの動作に関する仮定または積極的な観察を行う必要があります。よくある仮定は、小さなファイルを単一のディレクトリにまとめて、ファイルシステムの自然な順序で配置することが有益であるというものです。これは多くの場合妥当な仮定ですが、常に成り立つとは限りません。たとえば、アプリケーションは、おそらく異なるディレクトリにある複数の異なるファイルを、書き込み時とまったく同じ順序で読み込む可能性があります。したがって、すべての書き込みを単純に連続して順序付けるファイルシステムの方が、特定のアプリケーションにとっては高速に動作するかもしれません。
ファイルシステム自体が使用するカタログやインデックスも、それらに含まれるエントリが作成、変更、または削除されるにつれて、時間の経過とともに断片化する可能性があります。これは、ボリュームに多数の非常に小さなファイルが含まれている場合の方が、ボリュームに少数の大きなファイルが含まれている場合よりも問題となります。特定のファイルシステム設計によっては、ファイルや領域内に保持されている実際のデータレコードの断片化に関係なく、そのデータを含むファイルや領域も断片化する可能性があります(「通常の」ファイルについて上述したように)。[ 5 ]
一部のファイルシステム( NTFS [ c ]やHFS / HFS Plus [ 6 ]など)では、このデータを最適化するために必要な照合/ソート/圧縮をファイルシステムの使用中に容易に行うことはできません。[ 7 ]
ファイルシステムの断片化は、ファイルシステムが通常配置されるシーケンシャルアクセス速度と回転遅延(および程度は低いがシーク時間)の間の不均衡が大きくなるため、コンシューマーグレードのハードディスクドライブではより問題になります。 [ 8 ]したがって、断片化はファイルシステムの研究と設計において重要な問題です。断片化の抑制は、ファイルシステムのディスク上のフォーマットだけでなく、その実装にも大きく依存します。[ 9 ]ファイルシステムの断片化は、機械的なシーク時間が関係しないため、ソリッドステートドライブではパフォーマンスへの影響が少なくなります。[ 10 ]ただし、ファイルシステムは、ファイルの非連続部分ごとに追加のメタデータを保存する必要があります。メタデータの各ピース自体がスペースを占有し、処理能力とプロセッサ時間を必要とします。最大断片化制限に達すると、書き込み要求は失敗します。[ 10 ]
単純なファイルシステムベンチマークでは、現実的な経年劣化や断片化をモデル化することが難しいため、断片化係数は省略されることが多い。むしろ、比較を容易にするために、ファイルシステムベンチマークは空のファイルシステムで実行されることが多い。そのため、結果は実際のアクセスパターンとは大きく異なる可能性がある。[ 11 ]
断片化に対処するために、いくつかの手法が開発されてきました。これらは通常、先制型と事後型の2つのカテゴリに分類できます。アクセスパターンを予測することが難しいため、これらの手法は多くの場合ヒューリスティックな性質を持ち、予期せぬワークロード下ではパフォーマンスが低下する可能性があります。
プリエンプティブ方式は、ディスクへのデータ書き込み時に断片化を最小限に抑えることを目的としています。最もシンプルな方法は、新しい断片に新しいブロックを割り当てるのではなく、可能な限り既存の断片にデータを追記することです。
今日の多くのファイルシステムは、アクティブに追記されるファイルに、エクステントと呼ばれる、より長いチャンク、または異なる空き領域断片からのチャンクを事前に割り当てようとします。これにより、複数のファイルに同時に追記される際のファイルの断片化が大幅に回避され、ファイルが過度に絡み合うのを防ぐことができます。[ 9 ]
変更対象となるファイルの最終サイズが分かっている場合、ファイル全体のストレージを事前に割り当てることができます。例えば、Microsoft Windowsのスワップファイル(ページファイル)は通常動作中に動的にサイズ変更されるため、断片化が進む可能性があります。これを防ぐには、最小サイズと最大サイズが同じページファイルを指定することで、実質的にファイル全体を事前に割り当てることができます。
BitTorrentやその他のピアツーピアファイル共有アプリケーションは、ダウンロードを開始する際にファイルに必要なスペース全体を事前に割り当てることで断片化を制限します。[ 12 ]
比較的新しい技術として、XFS、HFS+ [ 13 ]、ZFSの遅延割り当てがあります。同じ技術は、reiser4およびext4では allocate-on-flush とも呼ばれます。ファイルシステムへの書き込み中は、ファイルシステムブロックが予約されますが、特定のファイルの場所はまだ確定されません。その後、メモリのプレッシャーやトランザクションのコミットの結果としてファイルシステムが変更をフラッシュする必要が生じた場合、アロケータはファイルの特性についてより正確な情報を得ることができます。このアプローチを採用しているほとんどのファイルシステムは、単一ディレクトリ内のファイルを連続してフラッシュしようとします。単一ディレクトリからの複数回の読み取りが一般的であると仮定すると、参照の局所性が向上します。[ 14 ] Reiser4 では、ディレクトリハッシュテーブルに従ってファイルのレイアウトも順序付けされるため、ファイルが自然なファイルシステムの順序 ( readdirで指定される順序) でアクセスされる場合、常に順次読み取られます。[ 15 ]
事後的な手法は、断片化が発生した後に、断片化、あるいは断片化による悪影響を軽減しようとするものです。多くのファイルシステムにはデフラグツールが用意されており、ファイルの断片を並べ替え、場合によっては、より小さなファイルをディレクトリ、ディレクトリツリー、あるいはディスク上のファイルシーケンスに近接させることで、断片の分散(つまり、連続性、または参照の局所性)を低減します。
HFS Plusファイルシステムは、ファイルを開く際に、サイズが20MiB未満で8つ以上の断片に分割されているファイルを透過的にデフラグします。 [ 16 ]
現在では廃止されたコモドール・アミーガのスマートファイルシステム(SFS)は、ファイルシステムの使用中に自動的にデフラグを実行しました。デフラグ処理は(処理対象の場所を除いて)ほぼ完全にステートレスであるため、瞬時に停止および再開できます。デフラグ中は、メタデータと通常データの両方についてデータの整合性が確保されます。
{{cite journal}}:ジャーナルを引用するには|journal=(ヘルプ)