デフラグメンテーション

**デフラグメンテーション**（）とは、コンピュータのファイルシステムにおけるフラグメンテーションを解消すること。しばしば略して**デフラグ**とも呼ばれる。

## HDDでの断片化
ハードディスクドライブ (HDD) のようなディスク式記憶装置でファイルの生成と削除を繰り返していると、ファイルが占める領域がだんだんと分断化されてゆく。これをフラグメンテーションまたは断片化という。ファイルが断片化すると、ひとつのデータがディスクのあちこちに点在している状態になり、余分にディスクヘッドを多く動かさなければならないため、ファイルアクセスが遅くなり、またディスク装置の寿命を縮める恐れもある。空き領域が断片化すると、大きなファイルを生成するときに断片化しやすくなる。元々は、ファイルシステムがあえて断片化を許容することでデータの柔軟な管理を可能としているため、断片化は宿命といえる。

デフラグはこのような断片化された状態を整理し、ファイルや空き領域を記憶装置中で連続的に配置し直すことによってファイルアクセスの速度を向上させる可能性がある。

デフラグメンテーション処理自体も連続的な読み書き動作をディスク装置に求めるため、ディスク装置の寿命を縮める可能性がある。どの程度の断片化でデフラグを行うべきか、といった点で信頼できる実験データなどは知られておらず、おおむね経験則に基づいて実行されている。

ウエスタンデジタルでは監視カメラ向けにファームウェアを最適化させたHDDを販売しており、専用のコマンドを利用することで書き込み時に断片化が起きないようにしている。

## 断片化の仕組み
### フラグメンテーションが発生するモデル
以下は解説の為に簡略化してある。ファイルシステムによってはフラグメンテーションが起こらないようファイルの配置が工夫されたものも多い。


凡例: □ = 空き領域、■・◆・★・● = ファイル

ファイル●の占めるサイズが■に続く空きに合わないため2つに分断された。これを断片化という。

この状態で、ファイル●を読み出そうとすると両方の場所へアクセスしなければならない。

記録された媒体がHDDの場合、一続きの領域へのアクセスに比べ、一続きでない領域へのアクセスは時間がかかるため、動作が遅くなる原因になる。


## デフラグの効果
ハードディスクへのアクセス時間は以下の式により求めることができる。

:アクセス時間 ＝ 平均位置決め時間 ＋ 平均回転待ち時間 ＋ データ転送待ち時間

平均位置決め時間と平均回転待ち時間は、ファイルの断片数に比例している。データ転送待ち時間は、ファイルサイズに比例している。

記憶装置全体でのファイルの断片化を少なくすれば、総体としてのファイルアクセスでの平均位置決め動作と平均回転待ち動作を減らせるため、読み書きの高速化が期待出来る。ただしデータ転送待ち時間は変化しない。

そのため断片化の解消は、**容量の小さいファイルには効果が大きいが、容量の大きなファイルには効果は少ない**。

### 計算例
平均位置決め時間が1秒、平均回転待ち時間が1秒、データ転送速度が1MB/秒のディスクがあるとする。

アクセス時間を計算すると
:断片化0の1MBファイルだと、アクセス時間=1秒+1秒+1秒=3秒
:断片化10の1MBファイルだと、アクセス時間=(1秒+1秒)*11+1秒=23秒
:断片化0の100MBファイルだと、アクセス時間=1秒+1秒+100秒=102秒
:断片化10の100MBファイルだと、アクセス時間=(1秒+1秒)*11+100秒=122秒

よってデフラグによる改善率を計算すると
:1MBのファイルは、23/3=766%
:100MBのファイルは、122/102=119%
となる。

## デフラグソフトでの高速化の手法
デフラグソフトでのファイルの読み書きの高速化の手法をいくつか示す。

### ディスク外周部への配置
ハードディスクにはデータがZCAV形式で記録されているため、ディスクの回転速度と記録密度が一定である。ハードディスクの外周部のデータ転送速度は、内周部のデータ転送速度に比べ、高速である。読み込み頻度の高いファイルをディスクの外周部に配置すると、データ転送待ち時間を短くすることができる。

### 空き領域の最適化
ファイルをすき間なく配置することにより、ファイルを全体的にディスク外周部に移動させることができる。そのため読み込み速度が高速化される。また大容量のファイルを書き込む場合に断片化しにくくなる。しかしファイルの直後に空き領域が存在しない場合は、ファイルへの追記を行うときにファイルの断片化が発生しやすくなる。

## 断片化の悪影響の軽減技術
デフラグソフトのメーカーは断片化によりパフォーマンスが低下すると主張している。しかし現在のオペレーティングシステムには、断片化の悪影響を軽減するための技術が搭載されている。これらの技術により通常の使用では断片化によるパフォーマンスの低下が抑えられている。

### ディスクキャッシュの利用
ハードディスクから読み込まれたデータは、メモリのキャッシュ領域に保存されている。同じデータを再度読み込むときは、メモリのキャッシュ領域から読み込む。近年のオペレーティングシステム (OS) はディスクキャッシュを積極的に活用するようになり、キャッシュファイルが巨大なメモリ領域を占有するようになったが、キャッシュミスする確率は相対的に低くなっている。そのため、近年のOSではメモリの増設によるファイルアクセスの高速化の効果は大きい。

### ファイルの利用履歴を利用した先読み
ファイルの利用頻度は均一ではなく、局在化する。よく使うファイルの履歴を保存しておき、バックグラウンドで先読みしメモリに保存しておく。Windows XPのPrefetcher、Windows VistaのWindows SuperFetchなどが該当する。

### 遅延書き込み
ディスクの書き込み時にはまずメモリのキャッシュ領域に書き込む。メモリのキャッシュ領域に書き込みが終了した時点で、ユーザーに書き込み完了を通知する。その後、バックグラウンドでメモリのキャッシュ領域からハードディスクに書き込む。断片化により書き込み時間が増加したとしても、ユーザーから見ると書き込み時間の遅延は感じられない。

### 読み込み順序の変更
ファイルが3個所に断片化しているとする。ファイル断片A、ファイル断片B、ファイル断片Cとする。それらがハードディスク上にファイル断片C、ファイル断片A、ファイル断片Bという順番で並んでいるとする。この場合は、ファイル断片A、ファイル断片B、ファイル断片Cの順番で読み込むと、シーク時間が増加する。しかし実際にはファイル断片C、ファイル断片A、ファイル断片Bの順番で読み込む。その後、OSやハードディスク内のドライバが結合し、アクセススピードが増加しないような措置がとられる。

## ソフトウェア
最も有名なデフラグメンター（デフラグソフト）は、DOSとWindowsにバンドルされている「デフラグ」と推測される。Windows 2000とWindows XPにはDiskeeperの機能限定版が搭載されている。

他の商用デフラグソフトには Diskeeper、PerfectDisk、O&O Defrag（廉価版は驚速デフラグ）、Norton SpeedDisk、TechTool Proなどがある。ソフトウェアを使わずに断片化を解消する方法としては、記憶装置のバックアップをとり、データを消去してからバックアップからデータを再度読み込み直せばよい。

## SSDでのデフラグ
ソリッドステートドライブ（SSD）は、ハードディスクドライブ（HDD）の代替デバイスとして使われる新たな補助記憶装置である。これはHDDとは根本的に動作原理が異なるため、従来のHDD用に設計されたデフラグメンテーションツール等とは、相性が非常に悪い。

前出のデフラグの効果では、ヘッドのシーク待ち時間や、ディスクの回転待ち時間などのHDDへのアクセス時間がその前提となっている。しかし、半導体メモリであるFlash SSDはアクセス時間がその約100万分の1程度と非常に短いため、断片化解消による改善効果は、SSDではほぼ存在しないに等しい。

また、SSD内部ではウェアレベリングやガベージコレクション等の処理により、高度な管理として動的にデータの記憶素子ページへの配置を分散している。そのため、HDD向けのデフラグツールの適用は単にSSDへの書き込み量を無駄にかつ大量に増加させ、もってSSD内部の管理メタデータの撹乱や、内部素子であるフラッシュメモリーの寿命を縮めるだけの処理となる。ライトアンプリフィケーションも参照。

。

Windows 8では、OS標準のデフラグツール「ドライブのデフラグと最適化」でSSDのドライブに対して、従来のHDD向けデフラグではなく、ボリュームの空き領域全体にTRIMコマンドを定期的に発行するように標準状態でスケジュールされている。なお、従来はSSDの専用ツールで行っていたSSDへのTRIMの発行を「SSDへのデフラグ」と称する向きもあるが、正しい用法ではない。

## 仮想ストレージでのデフラグ
ソリッドステートドライブ（SSD）の場合と似た理由で、仮想マシンにアタッチされ、または単体でマウントされた仮想ハードディスクに対する、HDD用に設計されたデフラグメンテーションツールの適用も、パフォーマンス上の問題を引き起こす場合がある。

具体的には、容量可変の仮想ハードディスクに対して従来のデフラグツールを適用すると、未使用領域に対する書込が生じ、それによって仮想ハードディスクの実容量が増加するという弊害が生じる。仮想マシンのゲストOS上でのデフラグツールの適用も同様の問題を起こす場合がある。

Windows 8では、OS標準のデフラグツール「ドライブのデフラグと最適化」で、仮想ハードディスク(VHD/VHDX)のマウント先のドライブに対して、従来のHDD向けデフラグではなく、使用中のブロック数が少なくなるようにデータ移動を行う（デフラグ (Windows)を参照）。

## OSごとの注意点
Windows Vistaでは初期設定で1週間に1度、デフラグが自動的に起動するように設定されている。デフラグ実行中はディスクへのアクセス速度が低下するため、マイクロソフトは、コンピュータ使用中はデフラグをオフにすることを呼びかけている  。

HFS+を採用するmacOSでは自動デフラグ機能がバックグラウンドで常時起動している。デフラグは少しずつ自動的に行われるため、ユーザーが意識する機会はない。また、ファイルの前後にあえて空き領域を確保することで断片化が起こりにくいようになっており、アップルはデフラグツールの使用を推奨していない。

## 標準のデフラグ・ツール
* FAT -  デフラグ
* exFAT - デフラグ・ツールを持たない
* ext2 - e2defrag
* ext3 - デフラグ・ツールを持たない
* ext4 - e4defrag
* NTFS - デフラグ
* ReiserFS - デフラグ・ツールを持たない
* XFS - xfs_fsr （マウント状態で使える）
* HFS+ - デフラグ・ツールを持たない（macOSでは遅延再配置とHot-File-Adaptive-Clusteringが自動デフラグを行う）

## 注釈