xfs_fsrを使ってXFSファイルシステムをベストの状態で使用する

 XFSファイルシステムは大規模なファイルの保存/アクセスについての性能が高いことで知られている。XFSの設計はエクステントベースで、ファイルの内容は一つ以上のエクステントと呼ばれる連続的な領域内に保存されている。XFSファイルシステム内のファイルは、ユーザの使い方によってはフラグメント化することがあるが、xfs_fsrユーティリティを使ってそのようなファイルをデフラグすることでファイルアクセスについてのシステムの性能を向上させることができる。

 ファイルをXFSファイルシステム上にコピーすると、通常は一つのエクステント内にファイルの全内容が保存される。しかしその後ファイルを延長したり新たなデータで内容を書き換えたりしようとする際には、ファイルの直後に続く領域が利用できないこともある。その場合、ファイルはディスク上の別々の場所にある2つのエクステントに分かれて保存されることになる。当然ながらファイルにアクセスするアプリケーションはこのことを考慮する必要はなく、ファイルの最初から最後までについて、線形に連続した領域の場合と同様に内容を普通に読み取ったり、lseek(2)でファイル内を移動したりすることができる。しかしファイルの内容がディスク上の多数のエクステントに分散して保存されていると、性能的には劣る。

 xfs_bmapユーティリティを使えば、XFSファイルシステム上に保存されている特定のファイルのエクステントについて知ることができる。-vオプション(詳細モード)を付けて実行すれば、ファイルの各部分がファイルシステム内のどのブロックにマッピングされているかが分かる。以下に示したファイルの場合、運悪く300MBのtarファイルが2つのエクステントに分割されてしまっている。

# xfs_bmap -v sarubackup-june2008.tar.bz2
sarubackup-june2008.tar.bz2:
 EXT: FILE-OFFSET       BLOCK-RANGE          AG AG-OFFSET           TOTAL
   0: [0..350175]:      264463064..264813239 10 (2319064..2669239) 350176
   1: [350176..615327]: 265280272..265545423 10 (3136272..3401423) 265152

 一方xfs_dbユーティリティを使えば、ファイルシステム全体のフラグメント化の状態を見ることができる。その際-rオプションを使えば、読み取りのみが可能なモードで操作が行われるので、マウント済みの使用中のファイルシステム上でも使用することができる。とは言えファイルシステムを実際に変更するつもりがない場合にはいずれにしろ-rを付けておいた方がおそらく良いだろう。xfs_dbのfragコマンドを実行すると、ディスクが数秒間動いた後、ファイルシステムのフラグメント化の状態を以下のように表示する。

# xfs_db -r /dev/mapper/raid2008-largepartition2008
xfs_db> frag
actual 117578, ideal 116929, fragmentation factor 0.55%