Skip to main content
ONTAP Technical Reports
日本語は機械翻訳による参考訳です。内容に矛盾や不一致があった場合には、英語の内容が優先されます。

ONTAPのディレクトリインデックス作成

共同作成者 whyistheinternetbroken

ONTAPは大規模なディレクトリを自動的にインデックス化するため、対象を絞った検索時にディレクトリファイル全体を一度に読み込む必要がありません。インデックス作成は `maxdir-size`とは別であり、ディレクトリファイルの最大上限を変更しません。

ディレクトリインデックスが存在する理由

コンピュータにおけるインデックスとは、すべてのレコードを走査することなく「これはどこにあるか?」という問いに答えるための補助的な構造です。書籍の索引はなじみ深い形式で、本全体を読む代わりに用語を調べて該当ページにジャンプできます。データベース、検索エンジン、ファイルシステムはすべて同じ考え方に基づいており、コレクションが大きくなっても検索コストを抑えることができます。インデックスはデータの複製ではありません。名前などのキーから該当アイテムの場所へのマッピングです。

ディレクトリとは、名前のリストのことです。インデックスがない場合、1つの名前を探すには、リストの大部分をくまなく調べなければなりません。ONTAPのディレクトリインデックスは、そのショートカットのファイルシステム版です。

永続的なインデックスがない場合、名前を検索するには、多くのディレクトリブロックを読み込み、メモリ内にハッシュを構築する必要があります。ONTAP 9.2 以降、ディレクトリファイルが約 2 MiB に達すると、ONTAP は自動的にコンパニオンディレクトリインデックス inode を作成します。

永続インデックスは、ディレクトリファイル内のエントリの場所にマッピングされます。したがって、ターゲットを絞った検索では、ディレクトリファイル全体をメモリに読み込む代わりに、必要なインデックスと特定のディレクトリブロックを読み取ることができます。インデックス作成は一般的に、大規模ディレクトリに対する検索指向の操作においてCPU、メモリ、およびI/Oを削減するため、大規模ディレクトリのコンテンツに加えて、他のワークロード向けにより多くのノードリソースを解放できます。

2 MiB未満のディレクトリファイルに対するクライアント名操作が、フルスキャンによって応答される様子を示すフロー図

ディレクトリインデックスを有効にするために管理者オプションは必要ありません。デフォルトで有効になっています。ディレクトリが永続的なインデックスの対象となるのは、そのディレクトリファイルが約2MiBのしきい値を超えた場合のみです。その条件が満たされると、ディレクトリをしきい値以上に拡張する操作、インデックススキャナ、またはLOOKUP、ACCESS、パスベースのオープンもしくは作成、名前変更、削除などの適格なフロントエンド名前操作によってインデックス構築が開始されます。これらのスキャナーとフロントエンドトリガーは、サイズしきい値を上書きしたり、より小さなディレクトリに対して永続的なインデックスを作成したりしません。約2MiBという数値の違いが、ターゲット検索の処理方法に影響を与えます。これはディレクトリサイズに基づくプロトコル遅延しきい値ではありません。ディレクトリの拡張がクライアントとノードの動作にどのように現れるかについては、"パフォーマンスへの影響"を参照してください。

インデックス作成で変わらないもの

ディレクトリインデックスはディレクトリファイルとは別個のものです。ディレクトリインデックスが存在する場合でも、以下のことは依然として当てはまります。

  • `maxdir-size`ディレクトリのファイルサイズには依然として制限があります。

  • コンパニオンインデックスは追加のメタデータとinodeを消費しますが、ディレクトリサイズには影響しません。

  • インデックスを作成することで、ディレクトリ全体を列挙するよりも、対象を絞った検索の精度が向上します。

  • ワイルドカードスキャンと `READDIR`は、引き続きディレクトリの名前空間全体を処理します。

  • インデックスの消失または再構築によって、ディレクトリ名は削除されません。ONTAPはディレクトリファイルから再構築できます。

プライベートインデックスinodeとパブリックインデックスinodeについて

インデックス付きディレクトリはそれぞれ独自のインデックスを持ち、ディレクトリインデックスは共有されません。したがって、ボリュームは、約2MiBのしきい値を超えて増大するディレクトリごとに1つのインデックスを保持できます。しきい値以下のディレクトリは非永続的なルックアップパス上に残り、スキャナまたはフロントエンド操作がアクセスする場合でも、コンパニオンのディレクトリインデックスinodeは割り当てられません。対象ディレクトリのインデックスがカウントされるかどうか `maxfiles`は、それらがプライベートかパブリックかによって異なります。詳細はこちらをご覧ください。

デフォルトでは、ディレクトリインデックスは従来、プライベートinode空間に存在していました。プライベートディレクトリインデックスinodeはSnapMirror転送から除外されるため、ONTAPはアクティベーションまたはリストア後に、必要に応じてデスティネーションでインデックスを再構築します。

ONTAP 9.17.1 以降、ボリュームレベルのオプション `-is-dir-index-transfer-enabled true`はディレクトリインデックスをパブリック inode 空間に移動し、サポートされている SnapMirror および SnapMirror Cloud ワークフローでそれらを転送できるようにします。オプションが `true`の場合、新しいインデックスはパブリック inode 空間に作成され、スキャナが既存のプライベートインデックスを移行します。これにより、リストア後のインデックス構築を削減できますが、パブリックインデックスはパブリック inode を消費するため、 `maxfiles`の計画に含める必要があります。

volume showオプションを使用すると、公開ディレクトリインデックスが存在するかどうかを確認できます -has-dir-index-public true。このオプションは手動で設定することはできません。公開ディレクトリインデックスが存在する場合にのみ「true」と表示されます。

公開ディレクトリのインデックスは `files`にカウントされ、インデックス付きディレクトリごとに約1つのinodeずつ `files-used`を増加させる可能性があります。

プライベートインデックスはパブリック `files`の割り当てを消費しません。

パブリックディレクトリインデックス転送を有効にするタイミング

インデックス転送を有効にすると、レプリケーションまたはリストア用にインデックスが保持され、ファイル数が多いディレクトリでのコストのかかる再構築を回避できます。インデックス転送が無効になっている場合、SnapMirrorはプライベートインデックスを省略します。アクティベーションまたはリストアの後、ONTAPは、インデックス作成スキャナーまたは対象となるフロントエンド処理を介して、該当するディレクトリの欠落しているインデックスを再構築できますが、これにより、SnapMirrorデスティネーションへのフェイルオーバー後にパフォーマンスに影響が及ぶ可能性があります。インデックス転送を有効にしても、ローカルのルックアップパフォーマンスは向上しません。このオプションが `false`の場合、ローカルのインデックス作成はすでに実行されています。これは、SnapMirror関係の一部であるボリュームでの使用のみを厳密に目的としています。

スパースディレクトリとホールパンチング

ディレクトリファイルは大きくなることがありますが、多くの名前が削除されると(つまり、ディレクトリからファイルが削除されると)、その後は疎になります。ディレクトリファイルのサイズは最大水位のままであるため、 `READDIR`空のブロックを走査するために相当量のCPUとI/Oを消費する可能性があります。

インデックス付きディレクトリの場合、ONTAPは4 KiBのディレクトリブロックが完全に空になったときに、穴を開けることができます。

インデックスはホールを追跡します。これにより、次のことが可能になります:

  • `READDIR`空のブロックはスキップできます。

  • 物理的なブロックは再利用可能です。

  • 作成されたオブジェクトは、後でその論理的な場所を再利用できます。

高度な `-has-optimized-sparse-directories`フィールドは、読み取り専用のボリューム表示オプションです。値 `true`は、ボリュームにディレクトリブロックが最適化されたホールパンチ形式で含まれていることを意味します。

アプリケーションのディレクトリサイズが削除後も問題となる場合は、残りのエントリを新しく作成したディレクトリにコピーすることで、よりコンパクトなディレクトリファイル構成を実現できます。低下 `maxdir-size`してもスパースディレクトリは圧縮されません。

"← 前へ:maxdir-size と現在のディレクトリサイズを表示する"

"次へ:maxdir-sizeの影響 →"