Linux NFS の先読み

このページでは、NetApp ボリュームをマウントする Linux クライアントで NFS 先読みを調整する方法について説明します。先読みにより、アプリケーションがファイル ブロックをリクエストする前にカーネルがファイル ブロックをプリフェッチできるため、シーケンシャル読み取りスループットが向上します。先読みはマウント オプションや同時実行の調整に代わるものではありません。まず、それらを構成します。詳細については、Linux NFS クライアントを最適化するをご覧ください。

始める前に

NFS リード アヘッドを調整する前に、次の前提条件を満たしてください。

  • スロット テーブルまたはセッション スロットをチューニングする場合は、まず Linux NFS の同時実行を完了します。

  • rsize などの適切な Linux NFS マウント オプションを使用してボリュームをマウントします。詳細については、Linux NFS マウント オプションをご覧ください。

  • ボリュームをマウントした後、先読みを調整します。

先読みの概要

アプリケーションがファイルを順次読み取る場合、Linux NFS クライアントは現在の読み取りを超える追加データをリクエストできます。これにより、ネットワーク レイテンシが隠蔽され、ログの再生、メディア ストリーミング、一括コピー、一部の分析スキャンなどの順次ワークロードのスループットが向上します。

先読みはマウント ポイントごとに構成されます。ランダム読み取りワークロードでは、順次読み取りワークロードほど効果的ではありません。

デフォルトと rsize

多くの Linux ディストリビューションでは、先読みが rsize の約 15 倍に設定されています。一部のディストリビューションでは、rsize に関係なく 128 KiB の固定先読みが使用されています。この場合、アップグレード後にシーケンシャル読み取りのパフォーマンスが低下する可能性があります。値を変更する前に、マウントされたファイル システムの現在の値を確認してください。

マウントの先読みを表示する

各 NFS マウント ポイントには、/sys/class/bdi/ に対応するバッキング ブロック デバイスがあります。バッキング ブロック デバイス識別子(BDI)を見つけて現在の read_ahead_kb 値を表示するには、次の手順を行います。

  1. /proc/self/mountinfo でマウントを探し、3 番目のフィールドにある BDI 識別子をメモします。

  2. 値をキロバイト単位で読み取ります。

    cat /sys/class/bdi/BDEV/read_ahead_kb
    

先読み値を選択する

ワークロードに適した先読み値を選択するには、次のガイドラインを使用します。

  • 最大限のパフォーマンスが必要ない場合は、ディストリビューションのデフォルトを維持し、先読みを調整しないでください。

  • ディストリビューションで自動的に設定されなくなった場合は、15 倍の rsize(KiB 単位)から始めます。

  • rsize=1048576(1 MiB)の場合、rsize の 15 倍は約 15,360 KiB(15 MiB)です。

  • 値を段階的に増減させ、アプリケーションと nfsiostat を使用してパフォーマンスを測定します。本番環境で使用する前に、15,360 KiB より大きい値をテストします。

先読みはページ キャッシュと連携します。キャッシュ(O_DIRECT)をバイパスするワークロードは、キャッシュされたシーケンシャル読み取りほど先読みのメリットを享受できません。

再起動後も先読みを維持する

動的な変更は、マウント解除または再起動するまで適用されます。NFS マウントでこれらの変更を永続化するには、udev ルールを作成します。

  1. /etc/udev/rules.d/99-nfs-readahead.rules を作成し、必要に応じて read_ahead_kb の値を調整します。

    SUBSYSTEM=="bdi", ACTION=="add", PROGRAM="/usr/bin/awk -v bdi=$kernel 'BEGIN{ret=1} {if ($4 == bdi) {ret=0}} END{exit ret}' /proc/fs/nfsfs/volumes", ATTR{read_ahead_kb}="15360"
    
  2. PROGRAM= 属性で、システム上の awk への絶対パスを使用します。

  3. udev を再読み込みします。

    sudo udevadm control --reload
    
  4. NFS ボリュームを再マウントするか、再起動して新しい BDI デバイスのルールをトリガーします。

まず、非本番環境ホストで udev ルールをテストします。一致式が間違っていると、間違ったルールが非 NFS ブロック デバイスに影響する可能性があります。

ワークロードに関するガイダンス

リード アヘッドをチューニングする際は、ワークロードのタイプに基づいて次のガイダンスを検討してください。

  • ランダム読み取り(OLTP、小規模なランダム I/O): デフォルトの先読みを維持します。

  • シーケンシャル読み取り(メディア、一括コピー、一部のハイ パフォーマンス コンピューティング): rsize を 15 倍に増やして測定します。

  • Mixed: プロファイリングでシーケンシャル読み取りのボトルネックが示された場合にのみ調整します。

  • rsize が低い(64 KiB)が、デフォルトの先読みが 128 KiB である: 先読みを 960 KiB 以上に増やすことを検討してください。

先読みチューニングを適切な rsize、nconnect、同時実行設定と組み合わせます。

次のステップ