[Amazon FSx for NetApp ONTAP] ボリュームの空きはあるのにファイルを追加できないとなったらinodeを確認しよう
ボリュームの空きはあるのにファイルもディレクトリも追加できないぞ
こんにちは、のんピ(@non____97)です。
皆さんは「Amazon FSx for NetApp(以降FSx for ONTAP)でボリュームの空きはあるのにファイルもディレクトリも追加できない」となったことはありますか? 私はあります。
このような時はinodeが原因だったりします。
inodeとはファイルやディレクトリなどのオブジェクトを表現するためのデータ構造のことです。ファイルの場所やファイルの種類、権限、サイズ、ブロック数、ポインター情報などを保持しています。
ONTAP のinodeは、Snapshotコピーを含め、ファイルシステム内の任意のファイルまたはフォルダへのポインタです。
- ボリュームに含めることができるファイルの数は、ボリューム内のinodeの数によって決まります。
- inodeはファイルを構成するブロックを指し、inodeはファイルのメタデータも含みます。
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-maximum
をtrue
にすることでボリュームサイズに応じた最大の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数をコントロールできるのはパブリック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 数を増やすことができます。
inode数は最大、ボリュームサイズ4KBあたり1つ作成することが可能です。ただし、inode数の上限は2,040,109,451
です。
通常、ボリューム内の inode の数は 4KB あたり 1 inode を超えることはできません。
これ以上のファイルやディレクトリを作成する場合は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 の分のスペースがボリュームに戻されることはありません。
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数の変化
スナップショットを取得した際の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] に設定した後は変更できません。
どうやら、files-set-maximum
をtrue
にすることでボリュームサイズに応じた最大の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-maximum
をtrue
に変更して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-maximum
をtrue
に変更したことで、inode数がボリュームサイズ20MBの上限である4,855まで増加しました。
files-set-maximum を false に変更
files-set-maximum
をfalse
に変更できるか確認してみます。先述の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-maximum
はfalse
になるようです。
ボリュームサイズを変更した際に files-set-maximum は true を維持するか
ボリュームサイズを変更した際にfiles-set-maximum
はtrue
を維持するか確認します。
一度files-set-maximum
をtrue
にした後、ボリュームサイズを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-maximum
はfalse
に変わりました。
ボリュームサイズが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の使用率を確認することも可能です。
これによりCloudWatchアラームでinodeの使用率が80%以上になった場合は通知するといったことも可能です。
inodeを監視してinode不足にならないように気をつけよう
FSx for ONTAPにおけるinodeを確認してみました。
FSx for ONTAP上に細かいファイルを大量に作成するようなユースケースの場合はinodeの監視が必須だと考えます。inode不足により処理が停止しないように気をつけましょう。
inode関連のNetAppのKBは以下にまとまっています。inode関連のエラーやinodeの仕様について気になった際は確認してみましょう。
この記事が誰かの助けになれば幸いです。
以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!