【xfs_info】コマンドの見方, XFSファイルシステムの特徴

はじめに

下記説明で分かりにくいと感じたら、もしかしたら以下のページをまず参照すると良いかもしれません。

Linux/XFS の directoryパーミッションと directoryサイズについて
Linux/XFS の directoryパーミッションと directoryサイズについて
Linux XFSファイルシステムの基礎 ファイルのタイプ Linuxでは全...

XFS ファイルシステムの特徴

XFSファイルシステムは RHEL7/CentOS7 以降で標準となるファイルシステムです。領域をAllocation Group というグループに分け、それぞれに i-node や空き領域等の管理を分散させているため、マルチコアCPUによる並列処理に強いのが特徴です。(実装を見たことはありませんが、) realtime というピンポイントでパフォーマンスを向上させる機能もあったりします。

また、スパースファイル(Data Extent)のサポートやジャーナル、クォータ設定などの ext4 の重要機能もしっかりと備えており、今後も活躍が期待されます。

xfs_info の出力例と見方

出力は5つのセクションに分かれます。

セクション1 : i-node等のメタ情報関連の [meta-data]セクション
セクション2 : ファイルの中身等データ領域関連の [data]セクション
セクション3: ディレクトリ関連の [naming]セクション
セクション4: ジャーナルログ関連の [log]セクション
セクション5: リアルタイム関連の [realtime]セクション

xfs_info はデバイスを指定する必要があるため、まずは df -T でデバイス名を調べます。

[root@localhost ~]# df -T
ファイルシス            タイプ   1K-ブロック    使用   使用可 使用% マウント位置
/dev/mapper/centos-root xfs         19056640 1146896 17909744    7% /
~~~ 省略 ~~~
[root@localhost ~]# xfs_info /dev/mapper/centos-root
meta-data=/dev/mapper/centos-root isize=512    agcount=4, agsize=1191680 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=4766720, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@localhost ~]#

[meta-data] セクション : メタ情報関連パラメータ

最初の3行は i-node やアロケーショングループ、セクターサイズ等のメタ情報です。

isize = i-node のサイズ

この例では 512byte です。

agcount = アロケーショングループの数

デフォルトでは 4 になります。この例でも 4 です。

agsize = 各アロケーションのブロック数

この例では 1,191,680 blks ≒ 1M blks です。後述しますが 1blk(ブロック) = 4096byte なので各アロケーショングループで約 4GB になります。

sectsz = HDDのセクターサイズ

この例では 512byte です。

attr = 拡張属性(Extended Attribute) のバージョン

現在はバージョン2 です。

projid32bit = プロジェクトID の 32bit 有効/無効bit

XFSのクォータはユーザー、グループ、ディレクトリーまたはプロジェクト単位で設定できます。プロジェクトIDは i-node バージョン1 では 16bit でしたが、i-node バージョン2 では32bit をサポートしています。1 の場合は32bit が有効です。

crc = CRC 機能の有効/無効bit

XFS 上で CRC(Cyclic Redundancy Check) によるチェックを行う機能を有効にするかどうかを設定できます。1 の場合は CRC が有効になります。

finobt = i-node の B+tree をアロケーショングループ毎に作る機能の有効/無効bit

Free I-Node B+Tree のことで、i-node の管理をアロケーショングループ毎に分割するかどうかを決めます。1 の場合は分割して管理されます。

spinodes = Sparse i-nodes 機能の有効/無効bit

i-node番号 は通常64bit ですが、この機能を有効にしていると、64bit未満で i-node番号を表現することができます。ただし、使わない方がよいでしょう。

[data] セクション : データ領域関連パラメータ

次の2行は主にデータ領域(ファイルに書き込んだデータ等を配置する領域)についての情報が記載されています。

bsize = ブロックサイズ

HDDへのアクセス(Disk IO)をどのような単位で行うかを定義します。通常はHDDセクターサイズの整数倍です。この例では 4096 byte ですので、4kB単位で入出力を行います。また、1ファイルにおけるディスク利用も 4kB単位になります。

blocks = 利用可能ブロック数

この例では 4,766,720 blks となっています。この値は agcount * agsize に等しいはずです。

imaxpct = i-node領域として予約するパーセンテージ

I-node MAX PerCenT のことです。この例では 25% になっています。

ディスクのサイズが 19GB ですのでその 1/4 の 4.7GBが i-node 領域として使われます。実際、df -ih で確認すると 9.1M 個の i-node が予約されており、これは 9.1M個 * 512 byte/個 ≒ 4.7GB となります。

[root@localhost ~]# df -ih
ファイルシス            Iノード I使用 I残り I使用% マウント位置
/dev/mapper/centos-root    9.1M   29K  9.1M     1% /

sunit = RAID stripe unit / swidth = RAID のデータドライブ数

RAIDコントローラの strip(e) size を指定します。例えば RAIDコントローラに8本のディスクが接続され、RAID 6 を構成し、strip(e) size が 64KB である場合は、sunit = 64k, swidth = 6 (8-2) となります。

参考:

http://xfs.org/index.php/XFS_FAQ#Q:_How_to_calculate_the_correct_sunit.2Cswidth_values_for_optimal_performance

この例では RAIDコントローラは使われていないのでともに 0 でOKです。

[naming] セクション : ディレクトリ関連パラメータ

次の1行はディレクトリ関連のパラメータです。ファイルの名前はディレクトリのデータ領域に書かれます。なので naming = ディレクトリ関連となっているようです。naming 規則にはバージョンがあり、現在は 2 が使われています。

bsize = ディレクトリ用のブロックサイズ

ディレクトリの配下にファイルを作成すると、ある一定量までは ディレクトリの i-node の中にその情報を持ちます。なのでその一定量を超えるまではデータ領域を使わないため、ディスク使用(ブロック割り当て)は 0 のままです。

[root@localhost test1]# ls -lsh
合計 0
0 drwxr-xr-x. 2 root root 6  8月 16 20:23 test2

ですがこの test2 ディレクトリの中に一定量を超えるとデータ領域にブロックを割り当てます。ディレクトリのサイズはその配下のファイル数およびそのファイル名に依存しますので、配下ファイルが増えていけば以下のようになります。

[root@localhost test1]# ls -lsh
合計 4.0K
4.0K drwxr-xr-x. 2 root root 4.0K  8月 16 20:29 test2

その時のブロックサイズがこのパラメータにより決まります。この例ではデータ領域のブロックサイズと同様 4096 byte (4KB) です。

ascii-ci = 大文字/小文字を区別するかどうかbit

ascii の Case Insensitive を 有効にする、つまり ascii-ci = 1 の場合は大文字と小文字の区別をしません(つまりWindowsのように test と Test は同じ名前と判断します)。

ftype = ファイルタイプの情報を i-node 内に保有するかどうかbit

ディレクトリ配下にあるファイルのタイプを、ディレクトリの i-node 内に持つかどうかを決めるbit です。

ファイルタイプとは、通常のファイル(f)なのか、ディレクトリ(d)なのか、シンボリックリンク(l)なのか、ブロックデバイスファイル(b)なのか、キャラクタデバイスファイル(c)なのか、名前付きパイプ(p)なのか、ソケット(s)なのか、の識別です。

実はファイルの i-node にもそのファイルのファイルタイプが格納されているので、上部のディレクトリにも同じ情報を持つのは冗長ではありますが、このほうが効率が良いことが多いため、デフォルトではこの機能がONになっています。

[log] セクション : ジャーナルログ関連パラメータ

ジャーナルログに使われる領域に関するパラメータです。internal は自デバイス内の領域を使う、という意味です。/dev/sdb1 に指定する等、他のデバイスを使わせることもできます。

bsize = ジャーナルログのブロックサイズ

ジャーナルログ用で使われる領域のブロック単位です。この例では 4096 byte (4KB) です。

blocks = ジャーナルログ用の割り当てブロック

この例では2560 bkls ですので、10MB が使われます。

version = ジャーナルログのバージョン

現在のバージョンは2です。

sectsz = HDDのセクターサイズ / sunit = RAID stripe unit

このあたりは前述の通りです。

lazy-count = ログの更新書き込みをまとめて行う機能の有効/無効bit

メタ情報が尋常ではないスピードで常に更新するような環境において、更新の都度に書き込みを行っているとパフォーマンス低下を招きます。この機能をON(lazy-count=1)にすると、一定量溜まってから一気に書き込むため、パフォーマンスが改善します。

[realtime] セクション : XFS の realtime 機能関連パラメータ

これは大容量の過去データを素早く表示するようなリアルタイムアプリケーションでの利用を想定した機能で、有効にすると速度向上が見込めます。この例では none(=無効)となっています。

extsz = realtime有効時のブロックサイズ

ブロックサイズを大きくすると効率が悪くはなりますが、入出力の速度が向上します。特定のアクセスのみブロックサイズを上げることでメリハリのある環境が作れます。

この値は data の bsize の整数倍になります。

blocks = realtime機能用のブロック数

この例では(機能が無効なので当然)0です。

rtextents

これについては情報が全くありませんでした。Tell me please.

最後に

これらの情報は man mkfs.xfs に結構書いてあるのでもし上記情報で不服であれば調べてみて下さい。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする