4.11. NFS コンテンツのクライアント側キャッシュの有効化
FS-Cache は、クライアント上の永続的なローカルキャッシュです。ファイルシステムがネットワーク経由で取得したデータを取得してローカルディスクにキャッシュするために使用できます。これにより、ネットワークトラフィックを最小限に抑えることができます。
4.11.1. NFS キャッシュの仕組み
以下の図は、FS-Cache の仕組みの概要を示しています。
FS-Cache は、システムのユーザーおよび管理者が可能な限り透過的になるように設計されています。FS-Cache を使用すると、オーバーマウントされたファイルシステムを作成することなく、サーバー上のファイルシステムがクライアントのローカルキャッシュと直接対話できるようになります。NFS では、マウントオプションにより、FS-cache が有効になっている NFS 共有をマウントするようにクライアントに指示します。マウントポイントにより、fscache
と cachefiles
の 2 つのカーネルモジュールの自動アップロードが実行します。cachefilesd
デーモンは、カーネルモジュールと通信してキャッシュを実装します。
FS-Cache は、ネットワーク上で動作するファイルシステムの基本操作を変更しません。単に、そのファイルシステムに、データをキャッシュできる永続的な場所を提供するだけです。たとえば、クライアントは FS-Cache が有効になっているかどうかに関わらず、NFS 共有をマウントできます。さらに、キャッシュされた NFS は、ファイルが部分的にキャッシュされ、事前完全に読み込む必要がないため、ファイル (個別または一括) に収まらないファイルを処理できます。また、FS-Cache は、クライアントファイルシステムドライバーからキャッシュで発生するすべての I/O エラーも非表示にします。
キャッシュサービスを提供するには、FS-Cache にキャッシュバックエンド、つまり cachefiles
サービスが必要です。FS-Cache には、ブロックマッピング (bmap
) と拡張属性をキャッシュバックエンドとしてサポートするマウントされたブロックベースのファイルシステムが必要です。
- XFS
- ext3
- ext4
FS-Cache は、ネットワークを介するかどうかに関係なく、あらゆるファイルシステムを任意にキャッシュすることはできません。FS-Cache の操作、データの保存または取得、およびメタデータの設定と検証を実行できるよう、共有ファイルシステムのドライバーが変更されている必要があります。FS-Cache では、永続性に対応するためにキャッシュされたファイルシステムの インデックスキー と 一貫性データ が必要になります。インデックスキーはファイルシステムオブジェクトをキャッシュオブジェクトに一致させ、一貫性データを使用してキャッシュオブジェクトが有効のままかどうかを判断します。
FS-Cache を使用する際には、さまざまな要素の妥協点を探すことになります。FS-Cache を使用して NFS トラフィックをキャッシュすると、クライアントの速度が低下する可能性があります。一方で、ネットワーク帯域幅を消費せずに読み取り要求をローカルで満たせるため、ネットワークとサーバーの負荷を大幅に軽減できます。
4.11.2. cachefilesd サービスのインストールと設定
Red Hat Enterprise Linux は、cachefiles
キャッシュバックエンドのみを提供します。cachefilesd
サービスは、cachefiles
を起動および管理します。/etc/cachefilesd.conf
ファイルは、cachefiles
によるキャッシュサービスの提供方法を制御します。
前提条件
-
/var/cache/fscache/
ディレクトリーの下にマウントされるファイルシステムは、ext3
、ext4
、またはxfs
です。 -
/var/cache/fscache/
の下にマウントされたファイルシステムは、拡張属性を使用します。これは、RHEL 8 以降でファイルシステムを作成した場合のデフォルトです。
手順
cachefilesd
パッケージをインストールします。# dnf install cachefilesd
cachefilesd
サービスを有効にして起動します。# systemctl enable --now cachefilesd
検証
fsc
オプションを使用して NFS 共有をマウントし、キャッシュを使用します。共有を一時的にマウントするには、次のように入力します。
# mount -o fsc server.example.com:/nfs/projects/ /mnt/
共有を永続的にマウントするには、
/etc/fstab
ファイルのエントリーにfsc
オプションを追加します。<nfs_server_ip_or_hostname>:/<exported_share> <mount point> nfs fsc 0 0
FS キャッシュの統計情報を表示します。
# cat /proc/fs/fscache/stats
関連情報
-
/usr/share/doc/cachefilesd/README
ファイル -
kernel-doc
パッケージにより提供されている/usr/share/doc/kernel-doc-<kernel_version>/Documentation/filesystems/caching/fscache.rst
4.11.3. NFS キャッシュの共有
キャッシュは永続的であるため、キャッシュ内のデータブロックは 4 つのキーのシーケンスでインデックス化されます。
- レベル 1: サーバーの詳細
- レベル 2: 一部のマウントオプション、セキュリティータイプ、FSID、識別子文字列
- レベル 3: ファイルハンドル
- レベル 4: ファイル内のページ番号
スーパーブロック間の整合性の管理に関する問題を回避するには、データのキャッシュを必要とする NFS のすべてのスーパーブロックに、固有のレベル 2 キーを設定します。通常、同じソースボリュームとオプションを持つ 2 つの NFS マウントは、スーパーブロックを共有しているため、そのボリューム内に異なるディレクトリーをマウントする場合でもキャッシュを共有することになります。
例4.1 NFS キャッシュ共有:
次の 2 つのマウントは、同じマウントオプションを持つため (特に NFS サーバー上の同じパーティションからのものであるため)、スーパーブロックを共有している可能性があります。
# mount -o fsc home0:/nfs/projects /projects # mount -o fsc home0:/nfs/home /home/
マウントオプションが異なる場合、スーパーブロックは共有されません。
# mount -o fsc,rsize=8192 home0:/nfs/projects /projects # mount -o fsc,rsize=65536 home0:/nfs/home /home/
ユーザーは、異なる通信またはプロトコルパラメーターを持つスーパーブロック間でキャッシュを共有することはできません。たとえば、NFSv4.0 と NFSv3 の間、NFSv4.1 と NFSv4.2 の間でキャッシュを共有することはできません。これは、強制されるスーパーブロックが異なるためです。また、読み取りサイズ (rsize
) などのパラメーターを設定した場合も、別のスーパーブロックが強制されるため、キャッシュの共有ができなくなります。
4.11.4. NFS キャッシュの制限
NFS にはキャッシュの制限がいくつかあります。
- ダイレクト I/O で共有ファイルシステムからファイルを開くと、自動的にキャッシュが回避されます。これは、この種のアクセスがサーバーに直接行なわれる必要があるためです。
- ダイレクト I/O または書き込みのいずれかで共有ファイルシステムからファイルを開くと、キャッシュされたファイルのコピーがフラッシュされます。ダイレクト I/O や書き込みのためにファイルが開かれなくなるまで、FS-Cache はファイルを再キャッシュしません。
- さらに、FS-Cache の今回のリリースでは、通常の NFS ファイルのみをキャッシュします。FS-Cache は、ディレクトリー、シンボリックリンク、デバイスファイル、FIFO、ソケットをキャッシュしません。
4.11.5. キャッシュカリングの仕組み
cachefilesd
サービスは、共有ファイルシステムからのリモートデータをキャッシュして、ローカルディスクの領域を解放することで機能します。これにより、使用可能な空き領域がすべて消費される可能性があり、ディスクにルートパーティションも含まれている場合は問題が発生する可能性があります。これを制御するために、cachefilesd
は、最近のアクセスが少ないオブジェクトなどの古いオブジェクトをキャッシュから破棄して、一定量の空き領域を維持しようとします。この動作はキャッシュカリングと呼ばれます。
キャッシュカリングは、基盤となるファイルシステムで使用可能なブロックのパーセンテージとファイルのパーセンテージに基づいて行われます。/etc/cachefilesd.conf
には、6 つの制限を制御する設定が存在します。
- brun N% (ブロックのパーセンテージ)、frun N% (ファイルのパーセンテージ)
- キャッシュの空き領域と利用可能なファイルの数がこれらの制限を上回ると、カリングはオフになります。
- bcull N% (ブロックのパーセンテージ)、fcull N% (ファイルのパーセンテージ)
- キャッシュの空き領域と利用可能なファイルの数がこれらの制限のいずれかを下回ると、カリング動作が開始します。
- bstop N% (ブロックのパーセンテージ)、fstop N% (ファイルのパーセンテージ)
- キャッシュ内の使用可能な領域または使用可能なファイルの数がこの制限のいずれかを下回ると、カリングによってこれらの制限を超える状態になるまで、ディスク領域またはファイルのそれ以上の割り当ては許可されません。
各設定の N
のデフォルト値は以下の通りです。
-
brun/frun
: 10% -
bcull/fcull
: 7% -
bstop/fstop
: 3%
この設定を行う場合は、以下の条件を満たす必要があります。
-
0 ≤
bstop
<bcull
<brun
< 100 -
0 ≤
fstop
<fcull
<frun
< 100
これは、空き領域と利用可能なファイルの割合であり、100 から、df
プログラムで表示される割合を引いたものではありません。
カリングは、bxxx と fxxx のペアを同時に依存します。ユーザーが個別に処理することはできません。