[Amazon FSx for NetApp ONTAP] ボリュームの空きはあるのにファイルを追加できないとなったらinodeを確認しよう

inodeを監視してinode不足でファイルを追加できないなんてことがないように気をつけよう
2022.12.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ボリュームの空きはあるのにファイルもディレクトリも追加できないぞ

こんにちは、のんピ(@non____97)です。

皆さんは「Amazon FSx for NetApp(以降FSx for ONTAP)でボリュームの空きはあるのにファイルもディレクトリも追加できない」となったことはありますか? 私はあります。

このような時はinodeが原因だったりします。

inodeとはファイルやディレクトリなどのオブジェクトを表現するためのデータ構造のことです。ファイルの場所やファイルの種類、権限、サイズ、ブロック数、ポインター情報などを保持しています。

ONTAP のinodeは、Snapshotコピーを含め、ファイルシステム内の任意のファイルまたはフォルダへのポインタです。

  • ボリュームに含めることができるファイルの数は、ボリューム内のinodeの数によって決まります。
  • inodeはファイルを構成するブロックを指し、inodeはファイルのメタデータも含みます。

inode とは - NetApp

inodeはファイルやディレクトリ一つ一つに割り当てられます。そのため、inodeが枯渇するとボリュームのデータを保存する領域に空きはあってもファイル、ディレクトリを追加することができなくなります。

ONTAPにおいてもinodeを意識する必要があります。

実際に確認してみたので紹介します。

いきなりまとめ

  • inodeが枯渇するとファイルを追加できなくなる
  • デフォルトではボリュームサイズ32KBあたり1つinodeが作成される
    • ボリュームサイズを拡張するとinode数も連動して増加する
  • 最大ボリュームサイズ4KBあたり1つinodeを作成することも可能
    • ただし、設定できるinode数の上限は2,040,109,451
    • ボリュームサイズ8TBでinode数の上限2,040,109,451を設定できるようになる
  • inodeの縮小をすることも可能
    • ただし、一度inodeを確保すると、inodeの下限値が引き上げられる
  • files-set-maximumtrueにすることでボリュームサイズに応じた最大のinode数が設定される
    • trueに設定後にfilesオプションでinode数を指定した場合や、ボリュームサイズを変更した場合はfalseとなる
  • CloudWatchでinodeの使用量を監視することも可能

ONTAPにおけるinodeについて

ONTAPにおけるinodeを確認します。NetAppのKBに以下のような記載がありました。

  • ボリュームには、プライベートinodeとパブリックinodeの両方があります。
    • パブリックinodeは、ユーザに表示されるファイルに使用されます。
    • プライベートinodeは、ONTAP によって内部的に使用されるファイルに使用されます。
  • 変更できるのは、ボリュームのパブリックinodeの最大数のみです。プライベートinodeの数は変更できません。
  • 各inodeは288バイトの容量を使用します
  • つまり、ボリューム内にinodeが多数あると、実際のデータの容量だけでなく、物理スペースもそれほど使用されないことになります。
  • ファイルのバイト数が64バイト未満の場合、inode自体に格納され、追加の容量は使用されません。
  • 各FlexVol ボリュームのinodeの数には限りがあり、最大値は2,040,109,451です。
  • inodeファイルで使用されるスペースは、ONTAP の10%のアグリゲートリザーブにカウントされます。

inode とは - NetApp

inode数をコントロールできるのはパブリックinodeで、NFSやSMBでアクセスできるファイルが割当たるのもパブリックinodeのようです。

また、inodeはデフォルトでボリュームサイズ32KBあたり1つ作成され、ボリュームサイズ680GBまでは自動でinodeが拡張されるようです。

ONTAP は、ボリュームサイズに基づいて、新しく作成するボリュームのパブリック inode の最大数をボリュームサイズ 32KB あたり 1 個の inode に自動的に設定します。管理者によって直接、または ONTAP のオートサイズ機能を通じてボリュームのサイズが拡張された場合、ボリュームサイズが 32KB あたり少なくとも 1 個の inode を確保するために、 ONTAP は必要に応じてパブリック inode の最大数も引き上げます。 ボリュームのサイズが約 680GB に達するまで。ONTAP では 22,369,621 個を超える inode は自動で作成されないため、ボリュームを 680GB より大きくしてもそれ以上 inode は追加されません。ボリュームサイズに対するデフォルト数を超えるファイルが必要な場合は、 volume modify コマンドを使用してボリュームの最大 inode 数を増やすことができます。

FlexVol ボリューム上で許可される最大ファイル数の変更に関する考慮事項

inode数は最大、ボリュームサイズ4KBあたり1つ作成することが可能です。ただし、inode数の上限は2,040,109,451です。

通常、ボリューム内の inode の数は 4KB あたり 1 inode を超えることはできません。

ボリューム inode 番号が 4KB あたり 1 個を超えています - NetApp

これ以上のファイルやディレクトリを作成する場合はFlexGroupにする必要があります。

FlexGroupのinode数はメンバーのFlexVolumeのサイズと数によって異なります。

メンバーボリュームサイズ メンバーボリューム数 デフォルトのinode数(FlexGroup )
100GB 8 24,903,672
100GB 16 49,807,344
1TB 8 170,009,008
1TB 16 340,018,016
100TB 8 170,009,008
100TB 16 340,018,016

抜粋 : ボリュームのデフォルトと最大inode数を確認する方法 - NetApp

ONTAPのinodeに含まれる情報は以下のとおりです。

  • inode が配置されているボリューム
  • ロック情報
  • ファイルのモードとタイプ
  • ファイルへのリンクの数
  • 所有者のユーザ ID とグループ ID
  • ファイル内のバイト数
  • アクセス時間と変更時間
  • inode 自体が最後に変更された時刻
  • ディスク上のファイルのブロックのアドレス
  • 権限 : UNIX ビットまたは Windows Access Control List (ACL)
  • qtree ID

ONTAPならではの要素はqtreeのIDぐらいでしょうか。

inode数以上のファイルを追加しようとしてみる

ボリュームの作成

実際にinode数以上のファイルを追加しようとしたときの挙動を確認してみます。

ボリュームの作成から行います。

なお、検証で使用したFSx for ONTAPファイルシステム、SVMは以下記事の検証で使用したものを流用しています。

サイズが20MBのボリュームvol1を作成します。

# 現在のボリュームの確認
::> volume show
Vserver   Volume       Aggregate    State      Type       Size  Available Used%
--------- ------------ ------------ ---------- ---- ---------- ---------- -----
SVM       SVM_root     aggr1        online     RW          1GB    972.0MB    0%

# サイズが20MBのボリューム vol1 を作成
::> volume create -vserver SVM -volume vol1 -aggregate aggr1 -size 20MB -state online -junction-path /vol1
[Job 68] Job succeeded: Successful

# vol1 を作成できたことを確認
::> volume show
Vserver   Volume       Aggregate    State      Type       Size  Available Used%
--------- ------------ ------------ ---------- ---- ---------- ---------- -----
SVM       SVM_root     aggr1        online     RW          1GB    972.0MB    0%
SVM       vol1         aggr1        online     RW         20MB    18.75MB    1%
2 entries were displayed.

作成したボリュームのinode数を確認します。

# ボリュームのinodeの数
::> volume show -fields files
vserver volume   files
------- -------- -----
SVM     SVM_root 31122
SVM     vol1     566
2 entries were displayed.

# 使用しているinodeの数の確認
::> df -i
Filesystem               iused      ifree  %iused  Mounted on                 Vserver
/vol/SVM_root/             103      31019      0%  /                          SVM
/vol/vol1/                  96        470     16%  /vol1                      SVM

inode数は566で、そのうち96個消費しています。

ファイルの作成

NFSクライアントからvol1をマウントし、空ファイルを1つ作成した際のinodeを確認します。

# vol1 をマウントポイントにマウント
$ sudo mount -t nfs svm-084bd75da1359a531.fs-07987ca18f2f0e911.fsx.us-east-1.amazonaws.com:/vol1 /mnt/fsxn/

# NFSv4でマウントできたことを確認
$ df -T -t nfs4
Filesystem                                                                   Type 1K-blocks  Used Available Use% Mounted on
svm-084bd75da1359a531.fs-07987ca18f2f0e911.fsx.us-east-1.amazonaws.com:/vol1 nfs4     19456   192     19264   1% /mnt/fsxn

# vol1 のinodeを確認
$ df -iT -t nfs4
Filesystem                                                                   Type Inodes IUsed IFree IUse% Mounted on
svm-084bd75da1359a531.fs-07987ca18f2f0e911.fsx.us-east-1.amazonaws.com:/vol1 nfs4    566    96   470   17% /mnt/fsxn

# 空ファイルの作成
$ sudo touch /mnt/fsxn/test

# サイズが 0 のファイルが作成されたことを確認
$ ls -li /mnt/fsxn/test
96 -rw-r--r-- 1 root root 0 Dec 28 04:44 /mnt/fsxn/test

# inodeの確認
$ df -iT -t nfs4
Filesystem                                                                   Type Inodes IUsed IFree IUse% Mounted on
svm-084bd75da1359a531.fs-07987ca18f2f0e911.fsx.us-east-1.amazonaws.com:/vol1 nfs4    566    97   469   18% /mnt/fsxn

# ボリュームの使用率も確認
$ df -T -t nfs4
Filesystem                                                                   Type 1K-blocks  Used Available Use% Mounted on
svm-084bd75da1359a531.fs-07987ca18f2f0e911.fsx.us-east-1.amazonaws.com:/vol1 nfs4     19456   256     19200   2% /mnt/fsxn

1つファイルを追加すると使用しているinodeが96から97へ1つ増えました。

もう少し大きいファイルを追加した場合もinodeの消費は1つなのか確認します。試しに10MBのファイルを作成します。

# 10MBのバイナリファイルを追加
$ sudo dd if=/dev/urandom of=/mnt/fsxn/random_block_file bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.071155 s, 147 MB/s

# inodeの確認
$ df -iT -t nfs4
Filesystem                                                                   Type Inodes IUsed IFree IUse% Mounted on
svm-084bd75da1359a531.fs-07987ca18f2f0e911.fsx.us-east-1.amazonaws.com:/vol1 nfs4    566    98   468   18% /mnt/fsxn

# ボリュームの使用率も確認
$ df -hT -t nfs4
Filesystem                                                                   Type  Size  Used Avail Use% Mounted on
svm-084bd75da1359a531.fs-07987ca18f2f0e911.fsx.us-east-1.amazonaws.com:/vol1 nfs4   19M   11M  8.7M  55% /mnt/fsxn

10MBと大きめのファイルを追加しましたが、inodeの消費は1つで済みました。

ちなみに、ONTAP CLIからinodeの番号から関連するファイルやディレクトリを確認することも可能です。

# inodeが96のファイルを確認
::> volume file show-inode -vserver SVM -volume vol1 -inode-number 96
                       Inode
Vserver   Volume       Number   File Path
--------- ------------ -------- ----------------------------------
SVM       vol1         96       /vol/vol1/test

# 詳細を確認
::> volume file show-inode -vserver SVM -volume vol1 -inode-number 96 -instance

           Vserver Name: SVM
            Volume Name: vol1
           Inode Number: 96
          Snapshot Name: -
   Physical Snapshot ID: 0
              File Path: /vol/vol1/test
              File Name: test
    Parent Inode Number: 64
Parent Directory Cookie: 2

# inode 96 の親のinode 64 を確認
::> volume file show-inode -vserver SVM -volume vol1 -inode-number 64
                       Inode
Vserver   Volume       Number   File Path
--------- ------------ -------- ----------------------------------
SVM       vol1         64       /vol/vol1

# 詳細を確認
::> volume file show-inode -vserver SVM -volume vol1 -inode-number 64 -instance

           Vserver Name: SVM
            Volume Name: vol1
           Inode Number: 64
          Snapshot Name: -
   Physical Snapshot ID: 0
              File Path: /vol/vol1
              File Name: vol1
    Parent Inode Number: 64
Parent Directory Cookie: 0

inodeを枯渇させる

それではinodeを枯渇させてみます。

inodeの空きが468なので、少しオーバーするように471個空ファイルを作ってみます。

471個からファイルを作成
$ for i in {000..470}; do
    sudo touch "/mnt/fsxn/test_${i}"
done

touch: cannot touch ‘/mnt/fsxn/test_468’: No space left on device
touch: cannot touch ‘/mnt/fsxn/test_469’: No space left on device
touch: cannot touch ‘/mnt/fsxn/test_470’: No space left on device

# inodeの確認
$ df -iT -t nfs4
Filesystem                                                                   Type Inodes IUsed IFree IUse% Mounted on
svm-084bd75da1359a531.fs-07987ca18f2f0e911.fsx.us-east-1.amazonaws.com:/vol1 nfs4    566   566     0  100% /mnt/fsxn

# ボリュームの使用率の確認
$ df -hT -t nfs4
Filesystem                                                                   Type  Size  Used Avail Use% Mounted on
svm-084bd75da1359a531.fs-07987ca18f2f0e911.fsx.us-east-1.amazonaws.com:/vol1 nfs4   19M   11M  8.5M  56% /mnt/fsxn

ボリュームの空き容量としては8.5MBほどありますが、No space left on deviceと469個目以降のファイルは作成できませんでした。空きinode数(IFree)を確認すると0となっていますね。

ONTAP CLIからも確認してみます。

# inodeの確認
::> df -i
Filesystem               iused      ifree  %iused  Mounted on                 Vserver
/vol/SVM_root/             103      31019      0%  /                          SVM
/vol/vol1/                 566          0    100%  /vol1                      SVM
2 entries were displayed.

# ボリュームの使用量の確認
::> df -h
Filesystem               total       used      avail capacity  Mounted on                 Vserver
/vol/SVM_root/           972MB      788KB      972MB       0%  /                          SVM
/vol/SVM_root/.snapshot   51MB     2684KB       48MB       5%  //.snapshot                SVM
/vol/vol1/                19MB       10MB     8596KB      55%  /vol1                      SVM
/vol/vol1/.snapshot     1024KB         0B     1024KB       0%  /vol1/.snapshot            SVM
4 entries were displayed.

こちらから確認しても空きinode数(ifree)は0となっていますね。

inode数の拡張

それではinode数の拡張を行います。

先述の通り、各ボリュームinodeの上限は2,040,109,451です。

試しにinodeの数を2,040,109,451にしようとしてみます。

::> volume modify -volume vol1 -files 2040109451

Error: command failed: Unable to set volume attribute "files" for volume "vol1" on Vserver "SVM". Reason: The value you entered (2040109451) is invalid; maximum inode count cannot exceed 4855.
       Cannot support more than one inode per 4 KB of disk space.

はい、ボリュームサイズ4KBあたり1個以上のinodeはサポートされないと怒られました。また、inodeは拡張できて4,855までとも記載されていますね。

inodeの数を4,855に引き上げてみます。

# inodeの数を4,855に拡張
::> volume modify -volume vol1 -files 4855
Volume modify successful on volume vol1 of Vserver SVM.

# inode数が変更されたことを確認
::> volume show -fields files
vserver volume   files
------- -------- -----
SVM     SVM_root 31122
SVM     vol1     4855
2 entries were displayed.

# inodeの空きが増えたことを確認
::> df -i
Filesystem               iused      ifree  %iused  Mounted on                 Vserver
/vol/SVM_root/             103      31019      0%  /                          SVM
/vol/vol1/                 566       4289     11%  /vol1                      SVM
2 entries were displayed.

# ボリューム使用量が増えたか確認
::> df -h
Filesystem               total       used      avail capacity  Mounted on                 Vserver
/vol/SVM_root/           972MB      788KB      972MB       0%  /                          SVM
/vol/SVM_root/.snapshot   51MB     2684KB       48MB       5%  //.snapshot                SVM
/vol/vol1/                19MB       10MB     8588KB      55%  /vol1                      SVM
/vol/vol1/.snapshot     1024KB         0B     1024KB       0%  /vol1/.snapshot            SVM
4 entries were displayed.

inodeの数が4,855に増えました。inodeの数が増えたので、ifreeも4,289になっていますね。また、8KBほどボリュームの空き容量が減りました。

ちなみにinodeの上限はvolume show -fields files-maximum-possibleでも確認できます。

# advanced に権限レベルを変更
::> set advanced

Warning: These advanced commands are potentially dangerous; use them only when directed to do so by NetApp personnel.
Do you want to continue? {y|n}: y

# 各ボリュームに設定できるinodeの上限を確認
::*> volume show -fields files-maximum-possible
vserver volume   files-maximum-possible
------- -------- ----------------------
SVM     SVM_root 249030
SVM     vol1     4855
2 entries were displayed.

inodeの空きが増えたということで、空ファイルを追加してみます。

# 空ファイルの追加
$ sudo touch /mnt/fsxn/test_468

# inodeの消費量の確認
$ df -iT -t nfs4
Filesystem                                                                   Type Inodes IUsed IFree IUse% Mounted on
svm-084bd75da1359a531.fs-07987ca18f2f0e911.fsx.us-east-1.amazonaws.com:/vol1 nfs4   4855   567  4288   12% /mnt/fsxn

ファイルの追加ができました。

inode数の縮小

inode数の縮小も試してみます。

縮小できるinodeもパブリックinodeです。

パブリック inode の最大数は削減することもできます。これにより、 inode に現在割り当てられているスペース量は変わりませんが、パブリック inode ファイルが消費できるスペースの最大容量が削減されます。ただし、 inode 用に割り当てられたスペースがボリュームに戻されることはありません。そのため、 inode の最大数を現在割り当てられている inode 数より減らしても、割り当て済みで未使用の inode の分のスペースがボリュームに戻されることはありません。

FlexVol ボリューム上で許可される最大ファイル数の変更に関する考慮事項

inode数を初期値の566に変更してみます。

::> volume modify -volume vol1 -files 566

Error: command failed: Unable to set volume attribute "files" for volume "vol1" on Vserver "SVM". Reason: New count must be larger than current allocated count of inodes(748) provisioned in the filesystem.

下限値は748と怒られてしまいました。もしかしたら下限値以上のinodeを1度使用すると、下限値が引き上がる挙動をするのでしょうか。

inode数を1,000にしたあと、一度inodeを999個消費してinodeの下限値を確認してみます。

まず、inodeの数を1,000に変更します。

# inodeの数を1,000に変更
::> volume modify -volume vol1 -files 1000
Volume modify successful on volume vol1 of Vserver SVM.

# inode数が変更されたことを確認
::> df -i -volume vol1
Filesystem               iused      ifree  %iused  Mounted on                 Vserver
/vol/vol1/                 567        433     56%  /vol1                      SVM

次に空ファイルを追加、削除をします。

# 空ファイルの追加
for i in {469..900}; do
    sudo touch "/mnt/fsxn/test_${i}"
done

# 使用しているinodeの数が増えたことを確認
$ df -iT -t nfs4
Filesystem                                                                   Type Inodes IUsed IFree IUse% Mounted on
svm-084bd75da1359a531.fs-07987ca18f2f0e911.fsx.us-east-1.amazonaws.com:/vol1 nfs4   1000   999     1  100% /mnt/fsxn

# 作成したからファイルを削除
$ for i in {469..900}; do
    sudo rm -f "/mnt/fsxn/test_${i}"
done

# 使用しているinodeの数が減ったことを確認
$ df -iT -t nfs4
Filesystem                                                                   Type Inodes IUsed IFree IUse% Mounted on
svm-084bd75da1359a531.fs-07987ca18f2f0e911.fsx.us-east-1.amazonaws.com:/vol1 nfs4   1000   567   433   57% /mnt/fsxn

ファイルを追加したタイミングで使用しているinodeの数が999になり、ファイルを削除すると使用しているinodeの数が567になりました。

この状態でinodeを748に引き下げようとしてみます。

::> volume modify -volume vol1 -files 748

Error: command failed: Unable to set volume attribute "files" for volume "vol1" on Vserver "SVM". Reason: New count must be larger than current allocated count of inodes(1000) provisioned in the filesystem.

inodeの下限値が1,000に変わりました。

やはり、下限値以上のinodeを1度使用すると、下限値が引き上がるようです。

ボリュームサイズを変更した際のinode数の確認

次にボリュームサイズを変更した際のinode数を確認します。

試しにボリュームサイズを20MBから21MBに変更します。

# ボリュームサイズを21MBに変更
::> volume modify -volume vol1 -size 21MB
Volume modify successful on volume vol1 of Vserver SVM.

# ボリュームサイズとinodeの確認
::> volume show -volume vol1 -fields size, files
vserver volume size files
------- ------ ---- -----
SVM     vol1   21MB 1000

inodeの数は増えていませんね。inodeの上限を確認して、上限に設定変更します。

# 設定できるinodeの上限を確認
::> volume modify -volume vol1 -files 2040109451

Error: command failed: Unable to set volume attribute "files" for volume "vol1" on Vserver "SVM". Reason: The value you entered (2040109451) is invalid; maximum inode count cannot exceed 5108.
       Cannot support more than one inode per 4 KB of disk space.

# inodeの数を変更
::> volume modify -volume vol1 -files 5108
Volume modify successful on volume vol1 of Vserver SVM.

# inodeの数が変更されたことを確認
::> volume show -volume vol1 -fields files
vserver volume files
------- ------ -----
SVM     vol1   5108

# inodeの空きが増えたことを確認
::> df -i -volume vol1
Filesystem               iused      ifree  %iused  Mounted on                 Vserver
/vol/vol1/                 567       4541     11%  /vol1                      SVM

ボリュームサイズが21MBの場合の最大inodeは5,108のようです。

この状態でinodeの下限値を確認します。

::> volume modify -volume vol1 -files 800

Error: command failed: Unable to set volume attribute "files" for volume "vol1" on Vserver "SVM". Reason: New count must be larger than current allocated count of inodes(1000) provisioned in the filesystem.

inodeの下限値は1,000のままです。

ファイルを10個ほど追加して下限値がどの程度引き上がるのか確認します。

# ファイルを10個追加
$ for i in {469..910}; do
    sudo touch "/mnt/fsxn/test_${i}"
done

# inodeの消費量を確認
$ df -iT -t nfs4
Filesystem                                                                   Type Inodes IUsed IFree IUse% Mounted on
svm-084bd75da1359a531.fs-07987ca18f2f0e911.fsx.us-east-1.amazonaws.com:/vol1 nfs4   5108  1009  4099   20% /mnt/fsxn

現在のinodeの下限値を確認します。

::> volume modify -volume vol1 -files 800

Error: command failed: Unable to set volume attribute "files" for volume "vol1" on Vserver "SVM". Reason: New count must be larger than current allocated count of inodes(1210) provisioned in the filesystem.

下限値が1,000から1,210に増えました。約2割ほど引き上げられましたね。

inode数を2,040,109,451にするためにはどの程度のボリュームサイズにする必要があるのか

inode数を2,040,109,451にするためにはどの程度のボリュームサイズにする必要があるのか確認します。

# 10TBの場合
::> volume modify -volume vol1 -size 10TB
Volume modify successful on volume vol1 of Vserver SVM.

::> volume modify -volume vol1 -files 2040109452

Error: command failed: Unable to set volume attribute "files" for volume "vol1" on Vserver "SVM". Reason: The value you entered is invalid;
       maximum inode count should be between 21251126 and 2040109451.

# 7TBの場合
::> volume modify -volume vol1 -size 7TB
Volume modify successful on volume vol1 of Vserver SVM.

::> volume modify -volume vol1 -files 2040109452

Error: command failed: Unable to set volume attribute "files" for volume "vol1" on Vserver "SVM". Reason: The value you entered is invalid;
       maximum inode count should be between 21251126 and 1785095783.

# 7.8TBの場合
::> volume modify -volume vol1 -size 7.8TB
Volume modify successful on volume vol1 of Vserver SVM.

::> volume modify -volume vol1 -files 2040109452

Error: command failed: Unable to set volume attribute "files" for volume "vol1" on Vserver "SVM". Reason: The value you entered is invalid;
       maximum inode count should be between 21251126 and 1989106717.

# 7.9TBの場合
::> volume modify -volume vol1 -size 7.9TB
Volume modify successful on volume vol1 of Vserver SVM.

::> volume modify -volume vol1 -files 2040109452

Error: command failed: Unable to set volume attribute "files" for volume "vol1" on Vserver "SVM". Reason: The value you entered is invalid;
       maximum inode count should be between 21251126 and 2014608097.

# 8TBの場合
::> volume modify -volume vol1 -size 8TB
Volume modify successful on volume vol1 of Vserver SVM.

::> volume modify -volume vol1 -files 2040109452

Error: command failed: Unable to set volume attribute "files" for volume "vol1" on Vserver "SVM". Reason: The value you entered is invalid;
       maximum inode count should be between 21251126 and 2040109451.

ボリュームサイズ8TBで上限に到達しました。

ちなみに8TBの時のinodeの数は21,251,126でした。

::> volume show -volume vol1 -fields size, files
vserver volume size files
------- ------ ---- --------
SVM     vol1   8TB  21251126

inode数を引き上げた後にボリュームサイズを縮小した場合

inode数を引き上げた後にボリュームサイズを縮小した場合の挙動を確認します。

ボリュームサイズが20MBの場合、inodeの上限は4,855でした。inodeを4,855以上設定した状態でボリュームサイズを20MBにするとどんな動きをするのでしょうか。

まず、空ファイルを大量に作成してinodeを消費します。

# 空ファイルの作成
$ for i in {911..5000}; do
    sudo touch "/mnt/fsxn/test_${i}"
done

# inodeが消費されていることを確認
$ df -iT -t nfs4
Filesystem                                                                   Type   Inodes IUsed    IFree IUse% Mounted on
svm-084bd75da1359a531.fs-07987ca18f2f0e911.fsx.us-east-1.amazonaws.com:/vol1 nfs4 21251126  1599 21249527    1% /mnt/fsxn

消費しているinode数は1,599です。

ボリュームサイズが8TBの時のinodeの下限値を確認します。

::> volume modify -volume vol1 -files 800

Error: command failed: Unable to set volume attribute "files" for volume "vol1" on Vserver "SVM". Reason: New count must be larger than current allocated count of inodes(6172) provisioned in the filesystem.

6,172のようです。

それでは、ボリュームサイズを20MBに変更してみて、inodeの上限値がどのようになるか確認します。

# ボリュームサイズを20MBに変更
::> volume modify -volume vol1 -size 20MB
Volume modify successful on volume vol1 of Vserver SVM.

# ボリュームサイズとinode数を確認
::> volume show -volume vol1 -fields size, files
vserver volume size files
------- ------ ---- --------
SVM     vol1   20MB 21251126

# inodeの下限値を確認
::> volume modify -volume vol1 -files 20

Error: command failed: Unable to set volume attribute "files" for volume "vol1" on Vserver "SVM". Reason: New count must be larger than current allocated count of inodes(6172) provisioned in the filesystem.

# inodeの上限値を確認
::> volume modify -volume vol1 -files 2040109451

Error: command failed: Unable to set volume attribute "files" for volume "vol1" on Vserver "SVM". Reason: Current value (21251126) is over the maximum allowable limit (4855) and cannot
       be increased. Maxfiles remains at 21251126.

# inodeの下限値を変更
::> volume modify -volume vol1 -files 6172
Volume modify successful on volume vol1 of Vserver SVM.

# 最大inode数を確認
::> volume show -volume vol1 -fields size, files
vserver volume size files
------- ------ ---- -----
SVM     vol1   20MB 6172

# inodeの上限値を確認
::> volume modify -volume vol1 -files 2040109451

Error: command failed: Unable to set volume attribute "files" for volume "vol1" on Vserver "SVM". Reason: Current value (6172) is over the maximum allowable limit (4855) and cannot
       be increased. Maxfiles remains at 6172.

ボリュームサイズの変更はできました。このタイミングではinodeの数は21,251,126のままです。また、上限値も21,251,126ですね。下限値もボリュームサイズが8TBの時と同じ6,172です。

inode数を下限値の6,172に変更すると上限値は6,172となりました。ボリュームサイズあたり4KBの壁を突破するために、一度ボリュームサイズとinode数を引き上げてからボリュームサイズを縮小させるみたいな裏技ができそうです。こちらの挙動はNetAppのKBにも記載されていますね。

環境

  • ONTAP 9
  • inode の数を増やしたあとにボリュームサイズを縮小した。

問題

  • 通常、ボリューム内の inode の数は 4KB あたり 1 inode を超えることはできません。
  • inode の数を増やしたあとにボリュームサイズを縮小した場合は、 inode の数が上限を超えます。

原因

これは想定される動作です。

  • すべての inode ブロックが使用中で、ボリュームの削減に合わせて inode の数が削減される場合は、問題が発生します。
  • このような問題を回避するため、ボリュームを縮小しても inode の数は変わりません。

解決策

この状態では、スペースは不要な inode ブロックに使用されます。

  • 必要に応じて inode 番号を手動で縮小します。
  • 実際に使用されている inode ブロックより少ない数を指定することはできません。

ボリューム inode 番号が 4KB あたり 1 個を超えています - NetApp

スナップショットを取得した際のinode数の変化

スナップショットを取得した際のinode

スナップショットを取得した際のinode数の変化を確認します。

# 現在のinode数の確認
::> df -i
Filesystem               iused      ifree  %iused  Mounted on                 Vserver
/vol/SVM_root/             103      31019      0%  /                          SVM
/vol/vol1/                5103       1069     82%  /vol1                      SVM
2 entries were displayed.

# スナップショットの取得
::> snapshot create -vserver SVM -volume vol1 -snapshot snapshot1

# スナップショット一覧
::> snapshot show -volume vol1
                                                                 ---Blocks---
Vserver  Volume   Snapshot                                  Size Total% Used%
-------- -------- ------------------------------------- -------- ------ -----
SVM      vol1
                  hourly.2022-12-28_0505                   360KB     2%    3%
                  hourly.2022-12-28_0605                   324KB     2%    3%
                  hourly.2022-12-28_0705                   268KB     1%    2%
                  snapshot1                                136KB     1%    1%
4 entries were displayed.

# inode数の確認
::> df -i
Filesystem               iused      ifree  %iused  Mounted on                 Vserver
/vol/SVM_root/             103      31019      0%  /                          SVM
/vol/vol1/                5103       1069     82%  /vol1                      SVM
2 entries were displayed.

スナップショットを取得してもinodeの消費量は変化ありませんね。

スナップショットからリストアした際のinode

次にスナップショットからリストアした際のinodeの数を確認します。

まず、NFSクライアントからvol1上のファイルを全て削除します。

# ファイルの削除
$ sudo rm -rf /mnt/fsxn/*

# inode数の確認
$ df -iT -t nfs4
Filesystem                                                                   Type Inodes IUsed IFree IUse% Mounted on
svm-084bd75da1359a531.fs-07987ca18f2f0e911.fsx.us-east-1.amazonaws.com:/vol1 nfs4   6172    96  6076    2% /mnt/fsxn

ファイルの削除をするとinodeの消費量が96まで落ちました。

この状態でスナップショットからリストアします。

# スナップショットの一覧を確認
::> snapshot show -volume vol1
                                                                 ---Blocks---
Vserver  Volume   Snapshot                                  Size Total% Used%
-------- -------- ------------------------------------- -------- ------ -----
SVM      vol1
                  hourly.2022-12-28_0505                   360KB     2%   14%
                  hourly.2022-12-28_0605                   324KB     2%   13%
                  hourly.2022-12-28_0705                   268KB     1%   11%
                  snapshot1                              12.05MB    60%   85%
4 entries were displayed.

# 手動で取得したスナップショットからリストア
::> snapshot restore -vserver SVM -volume vol1 -snapshot snapshot1

Warning: Quota rules currently enforced on volume "vol1" might change during this operation. If the currently enforced quota rules are different from those in
         Snapshot copy "snapshot1", you might have to resize or reinitialize quotas on this volume after this operation.
Do you want to continue? {y|n}: y

Warning: Export policies currently enforced on the qtrees of volume "vol1" will not change during this operation. If the currently enforced export policies are
         different from those in Snapshot copy "snapshot1", reassign the export policies of the qtrees on this volume after this operation.
Do you want to continue? {y|n}: y

# inodeの消費量を確認
::> df -i -volume vol1
Filesystem               iused      ifree  %iused  Mounted on                 Vserver
/vol/vol1/                5103       1069     82%  /vol1                      SVM

スナップショットからリストアするとinodeの消費量がファイル削除前の5,103まで戻りました。

ボリュームサイズに応じた最大のinode数を設定

ボリュームサイズに応じた最大のinode数を設定

AWS公式のFAQを見ていると以下のような文言がありました。

ボリュームの最大ファイル値を設定する

files-set-maximum オプションを使用して、ボリュームの最大ファイル値を設定できます。ボリュームの files-set-maximum の値が [true] に設定されている場合、ONTAP は maxfiles を可能な限り大きな値に自動的に調整します。

注: files-set-maximum オプションは 1 回限りの変数です。[true] に設定した後は変更できません。

FSx for ONTAP ボリュームの inode を増やす

どうやら、files-set-maximumtrueにすることでボリュームサイズに応じた最大のinode数が設定されるようです。手っ取り早く上限まで引き上げたい場合は便利そうです。

早速試してみます。

新しくvol2というボリュームを作成します。

# vol2 の作成
::> volume create -vserver SVM -volume vol2 -aggregate aggr1 -size 20MB -state online -junction-path /vol2
[Job 71] Job succeeded: Successful

# 作成したボリュームのinode数を確認
::> volume show -volume vol2 -fields size, files
vserver volume size files
------- ------ ---- -----
SVM     vol2   20MB 566

ボリュームサイズを20MBで作成したので、inode数は566でした。

現在のfiles-set-maximumを確認します。

# files-set-maximum の設定値を確認
::> volume show -volume vol2 -fields files-set-maximum

Error: invalid argument "files-set-maximum"

# 権限レベルを advanced に変更
::> set advanced

Warning: These advanced commands are potentially dangerous; use them only when directed to do so by NetApp personnel.
Do you want to continue? {y|n}: y

# files-set-maximum の設定値を確認
::*> volume show -volume vol2 -fields files-set-maximum
vserver volume files-set-maximum
------- ------ -----------------
SVM     vol2   false

権限レベルをadvancedに変更すると、現在の設定を確認できました。デフォルトではfalseですね。

それでは、files-set-maximumtrueに変更してinode数がどのように変化するのか確認します。

# files-set-maximum を true に変更
::*> volume modify -volume vol2 -files-set-maximum true
Volume modify successful on volume vol2 of Vserver SVM.

# files-set-maximum の設定値を確認
::*> volume show -volume vol2 -fields files-set-maximum
vserver volume files-set-maximum
------- ------ -----------------
SVM     vol2   true

# inode数の確認
::*> volume show -volume vol2 -fields size, files
vserver volume size files
------- ------ ---- -----
SVM     vol2   20MB 4855

files-set-maximumtrueに変更したことで、inode数がボリュームサイズ20MBの上限である4,855まで増加しました。

files-set-maximum を false に変更

files-set-maximumfalseに変更できるか確認してみます。先述のAWSのFAQには「設定した後は変更できません」とありましたが、どうでしょうか。

::*> volume modify -volume vol2 -files-set-maximum false

Error: command failed: Unable to set volume attribute "files-set-maximum" for volume "vol2" on Vserver "SVM". Reason: FALSE is not a valid input. To set maximum inode count to a non-maximum value, use the "files" option.

なるほど、確かにfalseに変更はできません。

しかし、「inode数を最大値意外に設定したいのであればfilesオプションを使用する」とエラーメッセージに書いてあります。

試しにinode数を1,000に変更してみます。

# inode数を1,000に変更
::*> volume modify -volume vol2 -files 1000
Volume modify successful on volume vol2 of Vserver SVM.

# inode数とfiles-set-maximum の設定値を確認
::*> volume show -volume vol2 -fields size, files, files-set-maximum
vserver volume size files files-set-maximum
------- ------ ---- ----- -----------------
SVM     vol2   20MB 1000  false

filesオプションを指定すると、確かに任意のinode数を指定できました。また、inode数を任意の数に変更するとfiles-set-maximumfalseになるようです。

ボリュームサイズを変更した際に files-set-maximum は true を維持するか

ボリュームサイズを変更した際にfiles-set-maximumtrueを維持するか確認します。

一度files-set-maximumtrueにした後、ボリュームサイズを1GBに変更します。

# files-set-maximum を true に変更
::*> volume modify -volume vol2 -files-set-maximum true
Volume modify successful on volume vol2 of Vserver SVM.

# files-set-maximum の設定値を確認
::*> volume show -volume vol2 -fields size, files, files-set-maximum
vserver volume size files files-set-maximum
------- ------ ---- ----- -----------------
SVM     vol2   20MB 4855  true

# ボリュームサイズを1GBに変更
::*> volume modify -volume vol2 -size 1GB
Volume modify successful on volume vol2 of Vserver SVM.

# files-set-maximum の設定値を確認
::*> volume show -volume vol2 -fields size, files, files-set-maximum
vserver volume size files files-set-maximum
------- ------ ---- ----- -----------------
SVM     vol2   1GB  31122 false

ボリュームサイズを変更するとこれまた、files-set-maximumfalseに変わりました。

ボリュームサイズが1GBの場合の最大inode数は249,030なので確かに上限まで引き上げられていないですね。

# files-set-maximum を true に変更
::*> volume modify -volume vol2 -files-set-maximum true
Volume modify successful on volume vol2 of Vserver SVM.

# inode数の確認
::*> volume show -volume vol2 -fields size, files, files-set-maximum
vserver volume size files  files-set-maximum
------- ------ ---- ------ -----------------
SVM     vol2   1GB  249030 true

そのため、ボリュームサイズ変更時にinode数を変更後のボリュームサイズの上限に設定したい場合は、同時に-files-set-maximum trueを指定する必要があります。

# ボリュームサイズを8TBに変更 & files-set-maximum を true に設定
::*> volume modify -volume vol2 -size 8TB -files-set-maximum true
Volume modify successful on volume vol2 of Vserver SVM.

# inode数が8TBの上限の2,040,109,451に設定されていることを確認
::*> volume show -volume vol2 -fields size, files, files-set-maximum
vserver volume size files      files-set-maximum
------- ------ ---- ---------- -----------------
SVM     vol2   8TB  2040109451 true

# ボリュームサイズを20MBに変更 & files-set-maximum を true に設定
::*> volume modify -volume vol2 -size 20MB -files-set-maximum true
Volume modify successful on volume vol2 of Vserver SVM.

# inode数が20TBの上限の4,855に設定されていることを確認
::*> volume show -volume vol2 -fields size, files, files-set-maximum
vserver volume size files files-set-maximum
------- ------ ---- ----- -----------------
SVM     vol2   20MB 4855  true

CloudWatchでinodeの使用量を監視

inodeが重要ということが分かりました。つまりはinode数を監視することも大切です。

各ボリュームのinode数(FilesCapacity)、inodeの消費量(FilesUsed)はCloudWatchメトリクスで確認できます。

こちらのメトリクスを組み合わせることでinodeの使用率を確認することも可能です。

inode使用率

これによりCloudWatchアラームでinodeの使用率が80%以上になった場合は通知するといったことも可能です。

inodeを監視してinode不足にならないように気をつけよう

FSx for ONTAPにおけるinodeを確認してみました。

FSx for ONTAP上に細かいファイルを大量に作成するようなユースケースの場合はinodeの監視が必須だと考えます。inode不足により処理が停止しないように気をつけましょう。

inode関連のNetAppのKBは以下にまとまっています。inode関連のエラーやinodeの仕様について気になった際は確認してみましょう。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!