Linux基礎

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

はじめに

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

Linux/XFS の directory size で 6 byte や 4096 byte が多い理由
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 のサイズ

この例では 512 bytes です。

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

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

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

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

sectsz = HDDのセクターサイズ

この例では 512 bytes です。

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

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

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

XFS のクォータはユーザー、グループ、ディレクトリーまたはプロジェクト単位で設定できます。プロジェクト ID は i-node バージョン 1 では 16 bit でしたが、i-node バージョン2 では 32 bit をサポートしています。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 番号 は通常 64 bit ですが、この機能を有効にしていると、64 bit 未満で i-node 番号を表現することができます。ただし、使わない方がよいでしょう。

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

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

bsize = ブロックサイズ

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

blocks = 利用可能ブロック数

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

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

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

ディスクのサイズが 19 GB ですのでその 1/4 の 4.7 GB が i-node 領域として使われます。

実際、df -ih で確認すると 9.1 M 個の i-node が予約されており、これは 9.1 M 個 * 512 byte/個 ≒ 4.7 GB となります。

[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 が 64 KB である場合は、sunit = 64 k, swidth = 6 (8-2) となります。

参考:

XFS FAQ - XFS.org

この例では 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 bytes (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 bytes (4 KB) です。

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

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

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 に結構書いてあるのでもし上記情報で不服であれば調べてみて下さい。

コメント

タイトルとURLをコピーしました