第7章 FS-Cache の使用

FS-Cache は、ファイルシステムがネットワーク経由で取得したデータをローカルディスクにキャッシュするために使用できる永続的なローカルキャッシュです。これは、ネットワーク経由でマウントされたファイルシステムからデータにアクセスするユーザーのネットワークトラフィックを最小限に抑えます (例: NFS)。

7.1. FS-Cache の概要

以下の図は、FS-Cache の仕組みの概要を示しています。

図7.1 FS-Cache の概要

FS-Cache は、システムのユーザーおよび管理者が可能な限り透過的になるように設計されています。Solaris では cachefs とは異なり、サーバー上のファイルシステムは、オーバーマウントしたファイルシステムを作成せずに、クライアントのローカルキャッシュと直接対話できます。NFS では、マウントオプションにより、FS-cache が有効になっている NFS 共有をマウントするようにクライアントに指示します。マウントポイントにより、fscachecachefiles の 2 つのカーネルモジュールの自動アップロードが実行します。cachefilesd デーモンは、カーネルモジュールと通信してキャッシュを実装します。

FS-Cache はネットワーク上で機能するファイルシステムの基本操作を変更せず、単にデータをキャッシュできる永続的な場所でファイルシステムを提供するだけです。たとえば、クライアントは FS-Cache が有効になっているかどうかに関わらず、NFS 共有をマウントできます。さらに、キャッシュされた NFS は、ファイルが部分的にキャッシュされ、事前完全に読み込む必要がないため、ファイル (個別または一括) に収まらないファイルを処理できます。また、FS-Cache は、クライアントファイルシステムドライバーからキャッシュで発生するすべての I/O エラーも非表示にします。

キャッシングサービスを提供するには、キャッシュバックエンド が必要です。キャッシュバックエンドは、cachefiles であるキャッシングサービスを提供するように設定されたストレージドライバーです。この場合、FS-Cache では、キャッシュバックエンドとして bmap および拡張属性 (ext3 など) に対応するブロックベースのファイルシステムをマウントする必要があります。

FS-Cache のキャッシュバックエンドで必要とされる機能に対応するファイルシステムには、以下のファイルシステムの Red Hat Enterprise Linux 8 実装が含まれます。

  • ext3 (拡張属性が有効)
  • ext4
  • XFS

FS-Cache は、ネットワークを介するかどうかに関係なく、ファイルシステムを任意にキャッシュすることはできません。共有ファイルシステムのドライバーを変更して、FS-Cache、データストレージ/検索、メタデータのセットアップと検証を操作できるようにする必要があります。FS-Cache では、永続性に対応するためにキャッシュされたファイルシステムの インデックスキー一貫性データ が必要になります。インデックスキーはファイルシステムオブジェクトをキャッシュオブジェクトに一致させ、一貫性データを使用してキャッシュオブジェクトが有効のままかどうかを判断します。

注記

Red Hat Enterprise Linux 8 では、cachefilesd パッケージはデフォルトでインストールされていないため、手動でインストールする必要があります。

7.2. パフォーマンスに関する保証

FS-Cache は、パフォーマンスの向上を 保証しません。キャッシュを使用するとパフォーマンスが低下します。たとえば、キャッシュされた NFS 共有では、ネットワーク間のルックアップにディスクアクセスが追加されます。FS-Cache は可能な限り非同期となりますが、これができない同期パス (読み込みなど) があります。

たとえば、FS-Cache を使用して、通常は負荷のない GigE ネットワークを介して 2 台のコンピューター間の NFS 共有をキャッシュしても、ファイルアクセスのパフォーマンスは向上しない可能性があります。代わりに、NFS 要求はローカルディスクからではなく、サーバーメモリーより早く満たされます。

したがって、FS-Cacheの使用は、さまざまな要因における 妥協 です。たとえば、NFS トラフィックのキャッシュに FS-Cache を使用すると、クライアントは多少遅くなりますが、ネットワークの帯域幅を消費せずにローカルに読み取り要求を満たすことでネットワークおよびサーバーの読み込み負荷が大幅に削減されます。

7.3. キャッシュの設定

現在、Red Hat Enterprise Linux 8 は cachefiles キャッシュバックエンドのみを提供します。cachefilesd デーモンは cachefiles を開始し、管理します。/etc/cachefilesd.conf ファイルは、cachefiles によるキャッシュサービスの提供方法を制御します。

キャッシュバックエンドは、キャッシュをホストしているパーティション上の一定の空き領域を維持することで動作します。空き領域を使用する他の要素に応じてキャッシュを増大および縮小し、root ファイルシステム (ラップトップなど) で安全に使用できるようにします。FS-Cache ではこの動作でデフォルト値を設定し、キャッシュカリング制限 で設定できます。キャッシュカリング制限の設定に関する詳細は、「キャッシュカリング制限の設定」を参照してください。

この手順では、キャッシュを設定する方法を説明します。

前提条件

  • cachefilesd パッケージがインストールされ、サービスが正常に起動しました。サービスが実行中であることを確認するには、次のコマンドを使用します。

    # systemctl start cachefilesd
    # systemctl status cachefilesd

    ステータスは active (running) である必要があります。

手順

  1. キャッシュとして使用するディレクトリーをキャッシュバックエンドで設定するには、次のパラメーターを使用します。

    $ dir /path/to/cache
  2. 一般的に、キャッシュバックエンドディレクトリーは、以下のように /etc/cachefilesd.conf 内に /var/cache/fscache として設定されます。

    $ dir /var/cache/fscache
  3. キャッシュバックエンドのディレクトリーを変更する場合、selinux コンテキストは /var/cache/fscache と同じである必要があります。

    # semanage fcontext -a -e /var/cache/fscache /path/to/cache
    # restorecon -Rv /path/to/cache
  4. キャッシュを設定する際に、/path/to/cache をディレクトリー名に置き換えます。
  5. selinux コンテキストを設定するコマンドが機能しない場合は、以下のコマンドを使用します。

    # semanage permissive -a cachefilesd_t
    # semanage permissive -a cachefiles_kernel_t

    FS-Cache は、/path/to/cache をホストするファイルシステムにキャッシュを保存します。ラップトップでは、root ファイルシステム (/) をホストのファイルシステムとして使用することが推奨されますが、デスクトップマシンの場合は、キャッシュ専用のディスクパーティションをマウントするより慎重に行ってください。

  6. ホストファイルシステムはユーザー定義の拡張属性に対応する必要があります。FS-Cache はこの属性を使用して、整合性のメンテナンス情報を保存します。ext3 ファイルシステム (つまり デバイス) のユーザー定義の拡張属性を有効にするには、次のコマンドを実行します。

    # tune2fs -o user_xattr /dev/device
  7. 代わりに、マウント時にファイルシステムの拡張属性を有効にするには、次のコマンドを使用します。

    # mount /dev/device /path/to/cache -o user_xattr
  8. 設定ファイルを置いたら、cachefilesd サービスを起動します。

    # systemctl start cachefilesd
  9. 起動時に cachefilesd が起動するように設定するには、root で次のコマンドを実行します。

    # systemctl enable cachefilesd

7.4. NFS でのキャッシュの使用

明示的に指示されない限り、NFS はキャッシュを使用しません。ここでは、FS-Cache を使用して NFS マウントを設定する方法を説明します。

前提条件

  • cachefilesd パッケージがインストールされ、実行している。これを実行していることを確認するには、次のコマンドを使用します。

    # systemctl start cachefilesd
    # systemctl status cachefilesd

    ステータスは active (running) である必要があります。

  • 以下のオプションで NFS 共有をマウントします。

    # mount nfs-share:/ /mount/point -o fsc

    ファイルがダイレクト I/O や書き込みのために開いていない限り、/mount/point の下にあるファイルへのアクセスはすべてキャッシュを経由します。詳細は、「NFS でのキャッシュの制限」を参照してください。NFS インデックスは NFS ファイルハンドルを使用してコンテンツをキャッシュします。ファイル名ではなく、ハードリンクされたファイルはキャッシュを正しく共有します。

NFS バージョン 3、4.0、4.1、および 4.2 はキャッシュに対応します。ただし、各バージョンはキャッシュに異なるブランチを使用します。

7.4.1. NFS キャッシュ共有の設定

NFS キャッシュの共有には潜在的な問題がいくつかあります。キャッシュは永続的であるため、キャッシュ内のデータブロックは 4 つのキーのシーケンスでインデックス化されます。

  • レベル 1: サーバーの詳細
  • レベル 2: 一部のマウントオプション、セキュリティータイプ、FSID、識別子
  • レベル 3: ファイルハンドル
  • レベル 4: ファイル内のページ番号

スーパーブロック間の整合性の管理に関する問題を回避するには、データのキャッシュを必要とする NFS のすべてのスーパーブロックに、固有のレベル 2 キーを設定します。通常、同じソースボリュームとオプションを持つ 2 つの NFS マウントはスーパーブロックを共有しているため、そのボリューム内に異なるディレクトリーをマウントする場合でもキャッシュを共有することになります。

以下は、異なるオプションでキャッシュ共有を設定する方法の例になります。

手順

  1. 次のコマンドで NFS 共有をマウントします。

    mount home0:/disk0/fred /home/fred -o fsc
    mount home0:/disk0/jim /home/jim -o fsc

    /home/fred および /home/jim には同じオプションがあるため、スーパーブロックを共有する可能性が高くなります。特に NFS サーバー上の同じボリュームやパーティションから作成されている場合は共有する可能性が高くなります (home0)。

  2. スーパーブロックを共有しないようにするには、mount コマンドに以下のオプションを付けて実行します。

    mount home0:/disk0/fred /home/fred -o fsc,rsize=8192
    mount home0:/disk0/jim /home/jim -o fsc,rsize=65536

    この場合、/home/fred/home/jim は、レベル 2 キーの異なるネットワークアクセスパラメーターを持つため、スーパーブロックを共有しません。

  3. 2 つのサブツリー (/home/fred1/home/fred2) のコンテンツを 2 回 キャッシュしてスーパーブロックを共有しないようにするには、次のコマンドを使用します。

    mount home0:/disk0/fred /home/fred1 -o fsc,rsize=8192
    mount home0:/disk0/fred /home/fred2 -o fsc,rsize=65536
  4. スーパーブロックの共有を回避するもう 1 つの方法は、nosharecache パラメーターで明示的に共有を回避することです。同じ例を使用します。

    mount home0:/disk0/fred /home/fred -o nosharecache,fsc
    mount home0:/disk0/jim /home/jim -o nosharecache,fsc

    ただし、この場合は、レベル 2 キーの home0:/disk0/fred および home0:/disk0/jim を区別することができないため、使用できるスーパーブロックは 1 つだけとなります。

  5. スーパーブロックにアドレスを指定するには、少なくとも 1 つのマウントに unique identifier に追加します。つまり、fsc=unique-identifier となります。

    mount home0:/disk0/fred /home/fred -o nosharecache,fsc
    mount home0:/disk0/jim /home/jim -o nosharecache,fsc=jim

    /home/jim のキャッシュで使用されるレベル 2 キーに固有識別子の jim が追加されます。

重要

ユーザーは、異なる通信またはプロトコルパラメーターを持つスーパーブロック間でキャッシュを共有することはできません。たとえば、NFSv4.0 と NFSv3 の間、NFSv4.1 と NFSv4.2 間で共有することはできません。これは、強制されるスーパーブロックが異なるためです。また、読み込みサイズ (rsize) などのパラメーターを設定すると、キャッシュの共有が回避されます。これは、別のスーパーブロックを強制するためです。

7.4.2. NFS でのキャッシュの制限

NFS にはキャッシュの制限がいくつかあります。

  • ダイレクト I/O で共有ファイルシステムからファイルを開くと、自動的にキャッシュが回避されます。これは、この種のアクセスがサーバーに直接行なわれる必要があるためです。
  • ダイレクト I/O または書き込みのいずれかで共有ファイルシステムからファイルを開くと、キャッシュされたファイルのコピーがフラッシュされます。ダイレクト I/O や書き込みのためにファイルが開かれなくなるまで、FS-Cache はファイルを再キャッシュしません。
  • さらに、FS-Cache の今回のリリースでは、通常の NFS ファイルのみをキャッシュします。FS-Cache はディレクトリー、シンボリックリンク、デバイスファイル、FIFO、ソケットを キャッシュしません

7.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 のペアを同時に依存します。ユーザーが個別に処理することはできません。

7.6. fscache カーネルモジュールからの統計情報の取得

FS-Cache は一般的な統計情報も追跡します。以下の手順では、この情報を取得する方法を説明します。

手順

  1. FS-Cache の統計情報を表示するには、次のコマンドを使用します。

    # cat /proc/fs/fscache/stats

FS-Cache の統計にはディシジョンポイントとオブジェクトカウンターに関する情報が含まれます。詳細は、以下のカーネルドキュメントを参照してください。

/usr/share/doc/kernel-doc-4.18.0/Documentation/filesystems/caching/fscache.txt

7.7. FS-Cache の参考資料

本セクションでは、FS-Cache の参考情報を詳細します。

  1. cachefilesd の詳細および設定方法は、man cachefilesd および man cachefilesd.conf を設定してください。その他にも、以下のカーネルドキュメントを参照してください。

    • /usr/share/doc/cachefilesd/README
    • /usr/share/man/man5/cachefilesd.conf.5.gz
    • /usr/share/man/man8/cachefilesd.8.gz
  2. 設計上の制約、利用可能な統計、機能など、FS-Cache に関する一般的な情報は、以下のカーネルドキュメントを参照してください。

    /usr/share/doc/kernel-doc-4.18.0/Documentation/filesystems/caching/fscache.txt


このページには機械翻訳が使用されている場合があります (詳細はこちら)。