コラム

NTFSではフラグメントは発生しにくい?
―― NTFS基礎のキソ ――

デジタルアドバンテージ
2000/10/21

 Windows NTの発表とともに新しいNTFSファイル・システムが紹介されたとき、マイクロソフトは「NTFSはFATと違ってフラグメントが起こりにくい」と公言していた。すでに述べているとおり、実際にはNTFSにおいてもフラグメントは日常的に発生する。それでは、何を根拠にこのような発言がなされたのだろうか? この理由は、NTFSで採用されたアイデアによるものと思われる。複雑なNTFSファイル・システムのすべてを紹介するのは別の機会に譲るとして、NTFSの大きな特徴の1つであるこのアイデアについてご紹介しよう。

その秘密はMFT(Master File Table)にあり

 ファイル・システムでは、広大なディスク領域をクラスタと呼ばれる固定領域に区切り、このクラスタを単位として割り当てることで、ディスク中にファイルを保存できるようにしている。ファイルのデータが、物理的にどのクラスタにどのような順番で記録されているかを管理するのがファイル・システムの役割であり、ファイルの読み書き要求に応じて、それを物理的なクラスタへのアクセスに変換する。

 MS-DOSやWindows 9xが採用するFATファイル・システムも、こうした基本的な管理方式は変わらない。そもそもFATファイル・システムという名前の由来は、ファイルとそれを構成するクラスタの対応関係などを記録した管理テーブルがFAT(File Allocation Table)という名称だったことによる。ファイル名やファイルの属性(読み出しのみ属性、隠しファイル属性など)、タイムスタンプなどはディレクトリ・エントリと呼ばれる特殊な領域に保存されるようになっていた。

 これに対しNTFSでは、ディスク中に含まれるすべてのファイルやディレクトリ(フォルダ)ごとに固定長の管理レコードを作成し、これを集中的に管理することで、ファイル・システムの柔軟性と機能性、信頼性を向上させようとしている。この管理レコード群はMFT(Master File Table)と呼ばれる。MFTの概要を図示すると次のようになる。

NTFSの心臓部、MFTの構成
MFT(Master File Table)は、ファイルやディレクトリごとに1つ(ないし複数)が対応する固定サイズ(通常は1Kbytes)のレコードからなる。このレコードの内部には、ファイル名やタイムスタンプ(日付)に加え、ファイルの属性が記録される。ユニークなのは、ファイルのデータ自体も属性の一部として捉え、サイズの小さなもの(他の属性にもよるが、通常は750bytes程度かそれ以下)については、MFT中のレコードに直接データを記録してしまうことだ(図の上側のレコード)。一方、MFTレコード内に収まりきらないサイズのファイルについては、MFT外部のクラスタにこれを書き込み、そのクラスタへのインデックスをMFTレコードに記録しておく。

 このようにMFTは、固定長のレコードからなるテーブルで、NTFSボリューム中に存在するファイルやディレクトリごとに1つ(ないし1つ以上)のエントリが対応する。レコード・サイズは最小で1Kbytes、最大で4Kbytesだが、通常は1Kbytesである。新しいファイルやディレクトリ(フォルダ)が作成されると、MFT内のレコードが1つ割り当てられる。

 MFTには、ファイル名やファイルのタイムスタンプ(作成日時/更新日時/アクセス日時)、アクセス権などの基本情報に加え、ファイルのデータ自身(ファイル本体)も属性の一部として捉える。これがNTFSの大きな特徴の1つだ。つまり他の属性データのサイズにもよるが、通常は約750bytes程度までの小さなファイルなら、MFTレコード内に記録されてしまうのだ(図の上側にある「小さなファイルのレコード」)。この場合、ファイル名などに関する情報と、データ自体を同じ場所から読み出すことが可能なので、ファイル・アクセスは極めて高速になる。

 一方、MFTレコードに収まりきらないようなファイルについては、MFTファイル以外の領域に一連の新しいクラスタが割り当てられ、そこへのインデックスのみがデータ属性内に記録される(図の下側にある「大きなファイルのレコード」)。ファイルに必要なサイズの連続したクラスタを1度に確保できない場合には、このクラスタへのインデックスは複数になる。これはまさにフラグメントしているファイルである。図には示していないが、1つのレコードにすべての属性が収まりきらない場合には、1つのファイルに対して複数のMFTレコードを使用することもある。なおNTFSでは、ディレクトリ(フォルダ)もファイルの一種として取り扱われるようになっており、わずかなファイルしか含んでいないディレクトリの情報は、MFTレコード内だけで完結できる。MFTレコードだけでは収まりきらないほどファイルが増えてきたら、MFT外部のクラスタを使う点も通常のファイルと同じである。

 ファイルのすべてが物理的に連続したクラスタに書き込まれている場合には、MFTレコード内のインデックスも1つですむが、フラグメントによってデータがとびとびになる場合は、それらの先頭クラスタへのインデックスがMFTレコードに記録される(ファイルがフラグメントしているというのは、このような状態を指す)。

予想外にたくさんある「小さな」ファイル

 このようにNTFSでは、小さなファイルやディレクトリに関しては、MFTレコードだけですべての情報を記録できる。つまり、小さなファイルによってクラスタが虫食い状態にならないということだ。

 問題は、750bytes未満などという小さなファイルがどれほどあるかであるが、実際にWindows 2000の検索機能を使って、手元のコンピュータでそれらのファイルをざっと検索してみたところ、ディレクトリやアプリケーションのショートカット、インターネット・ショートカット([お気に入り]メニューなどに登録される)、クッキーなどなど、実に数多くのファイルが存在している。FATではフラグメントの要因ともなっていたこれらのファイルも、MFTレコードのメカニズムによって、NTFSではフラグメントの要因から除外されている。特にこの種の小さなファイルは、一時ファイルなどとして頻繁に作成・削除されることを考えれば、かなりの影響があるだろう。

 もちろん、MFTレコードに収まらないサイズの大きなファイルについては、NTFSであってもフラグメントは起こる。しかし従来のFATに比較してフラグメントが発生しにくいとされた根拠は、この新しいMFTのメカニズムを指していたものと考えられる。

MFT自体もフラグメントを起こす可能性がある

 NTFSファイル・システムにおいては、MFTが重要な役割を果たすことがお分かりいただけただろう。ボリュームをNTFSでフォーマットすると、MFT用として、あらかじめボリューム全体の12.5%の領域が確保されるようになっている。

 しかし1つのボリュームに数多くのファイルが存在する場合や、激しいファイルのフラグメントに起因するクラスタのインデックスによってMFTレコードが不足した場合には、32レコード単位で自動的にMFTが拡張される仕様になっている。しかし前出のページング・ファイル同様、この場合には、MFTが激しくフラグメントを起こす可能性が高い。MFTはNTFSボリューム全体を管理する重要なデータであり、これがフラグメントを起こすと、ファイル入出力性能に大きな影響を及ぼすだろう。

Inside Microsoft Windows 2000 Third Edition
Windows 2000カーネルの内部を詳細に解説したユニークな解説書。Windows 2000の内部機構を知りたい技術者には必携の書。
Book Reviewを読む

 ページング・ファイルとは異なり、このMFTの自動拡張を抑制するようなオプションな存在しない。ただし後述するDiskeeperには、このMFTのフラグメントを防止するという機能(Frag Guard機能と呼ばれる)が追加されている。

 なお、紙数の都合から、ここではNTFSのメカニズムを詳しく述べられなかったが、NTFSの内部構造を詳しく知りたければ、『Inside Windows 2000 Third Edition』(Microsoft Press発行)が参考になるだろう(囲み記事参照)。


 INDEX
  [検証] ディスク・デフラグメント完全マスター
    1.ディスク・フラグメントの基礎知識(1)
     コラム:NTFSではフラグメントは発生しにくい?
    2.ディスク・フラグメントの基礎知識(2)
    3.Windows 2000標準のデフラグ・ツールを使う(1)
    4.Windows 2000標準のデフラグ・ツールを使う(2)
    5.フル機能版のDiskeeper 5.0を使う(1)
    6.フル機能版のDiskeeper 5.0を使う(2)
    7.検証:フラグメントはシステム・パフォーマンスにどれだけ影響を及ぼすのか?(1)
    8.検証:フラグメントはシステム・パフォーマンスにどれだけ影響を及ぼすのか?(2)
 
 検証


Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間