この記事では、ファイルの断片化がFlashのパフォーマンスに与える影響に焦点を当てます。
この記事をお読みになる前に、」と2つの記事をお読みになることをお勧めします。
I. クラスター
前回の記事では、フラッシュ内の2つの概念、ブロックとページを紹介しました。
ファイル・システム・レベルには**クラスター**という概念があり、ファイル・システムがファイルに割り当てる記憶領域の最小単位です。クラスターは記憶媒体のフォーマット時に指定され、ページの整数倍でなければなりません。
ファイルは下図のように複数のクラスターから構成されます。ファイルが実際に占有する領域のサイズは、クラスタのサイズの整数倍であり、ある程度無駄な記憶領域が生じます。
クラスタ、ページ、ブロックの関係は次の図で表すことができます。次の例では、ブロックには16ページが含まれ、クラスタには4ページが含まれます。
ファイルの断片化
ファイルの同時書き込みがない場合、各ファイルのクラスタは連続しているはずです。そうでない場合、複数のファイルがストレージ領域を相互申請すると、下図左のように、file1とfile2のクラスタが交差して配置されることになります。このようにクラスタが不連続になる現象がファイルの断片化です。
ある時点でfile1が削除されたとすると、file1が占有するページはstale状態になり、ブロック全体が消去されるまで再び使用することはできません。後でウェアレベリングやゴミ収集のためにブロックを再生する必要がある場合、ブロックが再生される前にfile2が占有しているページのデータを他のブロックにコピーしなければならず、必然的にTFカードの性能低下を引き起こします。
下図のように、ブロックが同じファイルで占有されている場合、file1が削除されると、ブロック全体が直接消去され、リサイクルされます。
**クラスタ・サイズがブロックの整数倍であれば、ブロック内に複数のファイルが存在しないことが保証されます。**もちろん、これは潜在的なスペースの浪費という結果をもたらします。
しかし、ブロック内にファイルが1つしかない場合でも、ファイルを変更するとファイルの断片化が発生する可能性があります。下図に示すように、file1の一部が変更されており、フラッシュはインプレース更新をサポートしていないため、その分の領域を再割り当てする必要があります。これを行う良い方法はありませんが、ファイルの変更を避けるようにし、避けられない場合はクラスタ単位で変更するようにしてください。
さらに、従来の機械式ハードディスクとは異なり、フラッシュは機械式ハードディスクのようにディスクを回転させてアドレスを指定する必要がないため、ファイルの断片化はフラッシュの読み取り操作にほとんど影響しません。
詳しくはご覧ください。
- www.man7.org/linux/man-p...
- superuser.com/questions/9...