ディレクトリキャッシュの調整
Netatalk の dircache(ディレクトリキャッシュ)は、ファイルとディレクトリの高度なマルチレイヤーキャッシュで、ファイルシステムの stat 情報、AppleDouble メタデータ、およびリソースフォークを含む。
最初のディレクトリ列挙中にキャッシュが構築されると、その後の操作はメモリから直接キャッシュされたデータを返すようになる。これにより、非常に大きなワーキングセットでも高速な操作が可能になる。AFPユーザーがファイルやディレクトリを名前変更または削除すると、dircacheエントリーはすべてのユーザーのために更新または削除される。dircacheは常にAFP操作と同期されているが、Netatalkの外部で行われた変更(例:ローカルファイルシステムの変更やSambaなどの他のファイル共有サービスによる変更)を検出しない。
dircache validation freq = 1 の場合、Netatalk は、キャッシュエントリーがストレージレイヤーとまだ一致していることを検証するために、すべてのアクセスで stat() 操作を実行する。キャッシュはほとんどの I/O 操作を回避するが、この ctime チェックはいくつかのオーバーヘッドを追加する。デフォルトの 100 は、Netatalk がボリュームを書き込む唯一のプロセスであると仮定し、これらの追加の stat() 呼び出しのほとんどをスキップして、ストレージおよびページキャッシュ層の負荷を軽減する。他のプロセスがボリュームを変更する場合は、multi protocol = yes で共有する(これにより、このオプションは他の一貫性設定とともに 1 にデフォルト設定される)、または明示的に 1 に設定する。
dircacheエントリーがアクセス時に古いと判断された場合、Netatalkは問題を優雅に検出し、ストレージから最新の状態でエントリーを再構築し、invalid_on_use カウンターをインクリメントする。invalid_on_use カウンターを使用して、外部の変更がまれであるが最大のパフォーマンスがまだ望ましい環境で dircache validation freq を調整することができる。
dircache size = number (G)
キャッシュ内のエントリーの最大数。与えられた値は、最も近い2のべき乗に切り上げられる。各エントリーは約192バイト(64ビットシステムの場合)を占め、接続されたユーザーごとに各afpd子プロセスが独自のキャッシュを持つ。dircache size を構成するときは、ユーザーの数を考慮すること。
デフォルト:65536、最大サイズ:1048576。
dircache validation freq = number (G)
外部変更検出のためのディレクトリキャッシュ検証頻度。 netatalk の外側で行われた変更を検出するために、キャッシュされたエントリーがファイルシステムに対してどのくらいの頻度で検証されるかを制御する。(例:他のプロセスによる直接的なファイルシステムの修正)。 1 の値は、すべてのアクセスで検証することを意味する。それ以外の値は、より少ない頻度で検証することを意味する。例えば、5 は、5 回目のアクセスごとにキャッシュエントリーを検証することを意味する。より高い値はパフォーマンスを向上させ、ストレージ I/O およびページキャッシュの負荷を軽減するが、外部変更の検出が遅れる可能性がある。
デフォルト:100、範囲:1〜100。 multi protocol = yes ボリュームは、このオプションを 1 にデフォルト設定する。
内部の netatalk 操作(ファイル/ディレクトリの作成、削除、名前変更)は、この設定に関係なく、常に dircache エントリーを即座に更新にする。Netatalk がボリュームにアクセスする唯一のプロセスである場合、最大のパフォーマンスのために 100 の値を安全に設定できる。
dircache mode = lru | arc (デフォルト: arc) (G)
キャッシュ置換アルゴリズム。Netatalk は 2 つのキャッシュエビクションポリシーをサポートする:
-
LRU(最も最近使用されていない) — レガシーアルゴリズム。アクセス時間(FIFO)で順序付けられた単一のリストを維持する。キャッシュが満杯になると、最も最近アクセスされていないエントリーが削除される。シンプルでメモリ効率が良い。
-
ARC(適応型置換キャッシュ) — より良いキャッシュヒット率を達成するために、新しさ と 頻度 を動的にバランスさせる最新の自己調整アルゴリズム。「LRUを上回る適応型置換キャッシュアルゴリズム」(Megiddo & Modha、IBM、2004)に基づいている。
ARCは観測されたアクセスパターンに適応するため、時間的局所性と頻度ベースの再利用を組み合わせたワークロードに対して効果的である。例えば、ユーザーが最近アクセスしたファイルやディレクトリと頻繁にアクセスしたファイルやディレクトリを交互に切り替える場合など。ARCは4つのリストを維持する:キャッシュされたエントリーのための2つのリスト(T1最近、T2頻繁)と、最近削除されたエントリーを追跡する2つのゴーストリスト(B1、B2)。ゴーストエントリーが再アクセスされると、ARCはミスから学習し、ポリシーを調整する。このゴースト学習とセグメンテーションがARCをLRUと区別するものであり、またARCをLRUキャッシュをフラッシュする可能性のあるシーケンシャルスキャンやバックアップに対して耐性のあるものにしている。
Netatalk の ARC は、完全なゴーストエントリーを使用する(すべての内容を保持する) IBMの論文のメタデータのみのゴーストではなく、 キャッシュエントリーが小さいため。 ゴーストヒットは、ファイルシステムのルックアップなしですぐにキャッシュに昇格されるため、 ARCはエッジケースでは常にLRUと同等以上のパフォーマンスを発揮し、 その他すべてのケースでより良いパフォーマンスを発揮するはずである。
メモリ: ARCはLRUの最大2倍のメモリを使用する可能性がある: cキャッシュされたエントリーに加えて、最大c削除されたエントリーをゴーストとして保持する可能性がある (ここで c は dircache size である)。 各エントリーは64ビットシステムで約192バイトである。 それでも、ARCは同じ総メモリのLRUキャッシュよりも優れたパフォーマンスを発揮する。
| モード | 追跡されるエントリー | メモリ(1000エントリーキャッシュ) |
|---|---|---|
| LRU | 1000 キャッシュされたエントリー | 約192 KB |
| ARC | 1000 キャッシュされたエントリー + 最大1000 ゴーストエントリー | 約384 KB |
デフォルトの dircache size 65536の場合:LRUは約12 MB、ARCは接続されたユーザーごとに最大約24 MBである。
推奨: メモリ制約のあるシステムには lru を使用する。
デフォルト:arc。
リソースフォークのキャッシュ
Netatalk は、リソースフォークデータをオプションでティア2の dircache レイヤーにキャッシュすることができる。キャッシュは、ボリュームの ea 設定がそれらを保存するバックエンド(AppleDouble ._ サイドカーファイルまたはファイルシステムの拡張属性)で Mac OS リソースフォークをカバーする。他の拡張属性はキャッシュされない。AFP クライアントが FPGetFileDirParams または FPEnumerate でディレクトリを列挙し、リソースフォークデータを要求する際に、繰り返しのストレージ I/O を回避する。リソースフォークは、フォルダのカバーアート(icns データ)など、多くの macOS データ構造を格納する。たとえば、カスタムディレクトリアイコンを設定したユーザーは、リソースフォークキャッシュレイヤーから大幅なパフォーマンス向上を観察することができる。
リソースフォークのキャッシュは、2つの設定によって制御される:
dircache rfork budget = number (デフォルト: 32768) (G)
接続されたユーザーごとにリソースフォークデータをキャッシュするためのKB単位の総メモリ予算。0に設定すると、リソースフォークのキャッシュが無効になる。
最大:10485760(KB単位で10 GB)。
dircache rfork maxsize = number (デフォルト: 1024) (G)
キャッシュされる単一のリソースフォークエントリーの最大サイズ(KB単位)。この値より大きいリソースフォークは、総予算にスペースが残っていてもキャッシュされない。
最大:10240(KB単位で10 MB)。
multi protocol = yes のボリュームは、他のプロセスが afpd に気付かれずにリソースフォークを変更できるため、デフォルトでリソースフォークキャッシュから除外される。明示的な dircache rfork budget 設定は、ログに警告を出して除外を解除する。
ファイルの ctime や inode は更新されたり、または AFP クライアントはリソースフォークを更新されたりした場合にキュアッシュされたエントリーは無効になる。予算は超過される場合に LRU/ARC 順にエントリが削除される。
例 (100 MB rfork 予算、エントリー毎に最大 5 MB):
dircache rfork budget = 102400
dircache rfork maxsize = 5120
例(Netatalk のみがボリュームにアクセスする場合):
dircache validation freq = 100
例(大きなキャッシュを伴うファイル集約型ワークロードの場合):
dircache size = 262144
dircache validation freq = 100
dircache mode = arc
【注記】 afpd が正常にシャットダウンした時(ユーザーが切断した時)に Netatalk ログファイルで “dircache statistics:” 行をチェックして dircache の有効性を監視すること。