Azure NetApp Files 用の Linux NFS マウント オプションのベスト プラクティス

この記事は、マウント オプションと、それらを Azure NetApp Files で使用するためのベスト プラクティスについて理解するのに役立ちます。

Nconnect

nconnect マウント オプションを使用すると、NFS クライアントと NFS エンドポイントの間に確立される接続 (ネットワーク フロー) の数を上限の 16 まで指定できます。 従来、NFS クライアントでは、それ自体とエンドポイント間には 1 つの接続が使用されます。 ネットワーク フローの数を増やすと、I/O とスループットの上限が大幅に増えます。 テストで nconnect=8 のパフォーマンスが最も高いことがわかりました。

実稼働用にマルチノード SAS グリッド環境を準備する際に、実行時間を 8 時間から 5.5 時間に 30% 繰り返し短縮できることに気付くかもしれません。

マウント オプション ジョブの実行時間
nconnect なし 8 時間
nconnect=8 5.5 時間

両方のテスト セットで同じ E32-8_v4 仮想マシンと RHEL 8.3 を使用しており、先読みは 15 MiB に設定されています。

nconnect を使用する場合は、次の規則にご注意ください。

  • nconnect は、すべての主要な Linux ディストリビューションの Azure NetApp Files でサポートされますが、新しいリリースでのみとなります。

    Linux リリース NFSv3 (最小リリース) NFSv4.1 (最小リリース)
    Redhat Enterprise Linux RHEL8.3 RHEL8.3
    SUSE SLES12SP4 または SLES15SP1 SLES15SP2
    Ubuntu Ubuntu18.04

    Note

    SLES15SP2 は SUSE の最小リリースであり、nconnect は NFSv4.1 の Azure NetApp Files でサポートされています。 指定されている他のすべてのリリースは、nconnect 機能を導入した最初のリリースです。

  • 次のシナリオに示すように、1 つのエンドポイントからのすべてのマウントで、マウントされた最初のエクスポートの nconnect 設定が継承されます。

    シナリオ 1: nconnect は最初のマウントで使用されます。 そのため、同じエンドポイントに対するすべてのマウントで nconnect=8 が使用されます。

    • mount 10.10.10.10:/volume1 /mnt/volume1 -o nconnect=8
    • mount 10.10.10.10:/volume2 /mnt/volume2
    • mount 10.10.10.10:/volume3 /mnt/volume3

    シナリオ 2: nconnect は最初のマウントでは使用されません。 そのため、同じエンドポイントに対するマウントで nconnect は使用されません。その後すぐに nconnect が指定される場合でも同様です。

    • mount 10.10.10.10:/volume1 /mnt/volume1
    • mount 10.10.10.10:/volume2 /mnt/volume2 -o nconnect=8
    • mount 10.10.10.10:/volume3 /mnt/volume3 -o nconnect=8

    シナリオ 3: nconnect 設定は個別のストレージ エンドポイントに伝達されません。 nconnect は、10.10.10.10 からのマウントで使用されますが、10.12.12.12 からのマウントでは使用されません。

    • mount 10.10.10.10:/volume1 /mnt/volume1 -o nconnect=8
    • mount 10.12.12.12:/volume2 /mnt/volume2
  • nconnect は、特定のクライアントからストレージの同時実行性を向上させるために使用される場合があります。

詳細については、Azure NetApp Files 用の Linux の同時実行のベスト プラクティスに関するページを参照してください。

Nconnect の考慮事項

nconnectsec=krb5* のマウント オプションを一緒に使用することはお勧めしません。 2 つのオプションを組み合わせて使用すると、パフォーマンスの低下が見られました。

Generic Security Standard Application Programming Interface (GSS-API) は、ピア アプリケーションに送信されるデータを保護する方法をアプリケーションに提供します。 このデータは、あるコンピューター上のクライアントから別のコンピューター上のサーバーに送信されたものである可能性があります。 

Linux で nconnect を使用する場合、GSS セキュリティ コンテキストは特定のサーバーへのすべての nconnect 接続間で共有されます。 TCP は信頼性の高いトランスポートであり、シーケンス番号のスライディング ウィンドウを使用して、GSS ストリーム内の順序が正しくないパケットを処理するために順不同のパケット配信をサポートします。 シーケンス ウィンドウにないパケットを受信すると、セキュリティ コンテキストが破棄され、新しいセキュリティ コンテキストがネゴシエートされます。 破棄されたコンテキストで送信されたメッセージはすべて無効になるため、メッセージの再送信が必要になります。 nconnect セットアップ内のパケット数が多いほど、ウィンドウ外パケットが頻繁に発生し、上記の動作がトリガーされます。 この動作では、特定の低下率を指定することはできません。

Rsize および Wsize

このセクションの例では、パフォーマンス チューニングにアプローチする方法について説明します。 特定のアプリケーションのニーズに合わせて調整が必要になる場合があります。

rsize および wsize フラグでは、NFS 操作の最大転送サイズを設定します。 マウント時に rsizewsize が指定されていない場合、クライアントとサーバーでは、その 2 つでサポートされる最大サイズをネゴシエートします。 現在、Azure NetApp Files と最新の Linux ディストリビューションの両方で、1,048,576 バイト (1 MiB) の読み取りおよび書き込みサイズがサポートされています。 ただし、全体的なスループットと待機時間を最適にするために、Azure NetApp Files では rsizewsize の両方を 262,144 バイト (256 K) 以下に設定することをお勧めします。 256 KiB より大きい rsizewsize を使用すると、待機時間が長くなり、スループットが低下するおそれがあります。

たとえば、「SUSE Linux Enterprise Server 上の Azure NetApp Files を使用して Azure VM のスタンバイ ノードで SAP HANA スケールアウト システムをデプロイする」では、次のように 256 KiB の rsizewsize が示されています。

sudo vi /etc/fstab
# Add the following entries
10.23.1.5:/HN1-data-mnt00001 /hana/data/HN1/mnt00001  nfs rw,vers=4,minorversion=1,hard,timeo=600,rsize=262144,wsize=262144,noatime,_netdev,sec=sys  0  0
10.23.1.6:/HN1-data-mnt00002 /hana/data/HN1/mnt00002  nfs   rw,vers=4,minorversion=1,hard,timeo=600,rsize=262144,wsize=262144,noatime,_netdev,sec=sys  0  0
10.23.1.4:/HN1-log-mnt00001 /hana/log/HN1/mnt00001  nfs   rw,vers=4,minorversion=1,hard,timeo=600,rsize=262144,wsize=262144,noatime,_netdev,sec=sys  0  0
10.23.1.6:/HN1-log-mnt00002 /hana/log/HN1/mnt00002  nfs   rw,vers=4,minorversion=1,hard,timeo=600,rsize=262144,wsize=262144,noatime,_netdev,sec=sys  0  0
10.23.1.4:/HN1-shared/shared /hana/shared  nfs   rw,vers=4,minorversion=1,hard,timeo=600,rsize=262144,wsize=262144,noatime,_netdev,sec=sys  0  0

たとえば、SAS Viya では、256 KiB の読み取りと書き込みのサイズが推奨され、SAS GRID では、NFS マウントの先読みを増やして読み取りパフォーマンスを向上させる一方で、r/wsize が 64 KiB に制限されます。 詳細については、Azure NetApp Files の NFS 先読みのベスト プラクティスに関するページを参照してください。

rsizewsize の使用には以下の考慮事項が適用されます。

  • 多くの場合、ランダム I/O 操作のサイズは、rsizewsize のマウント オプションよりも小さくなります。 そのため、これらは制約ではありません。
  • ファイルシステム キャッシュを使用する場合、ファイル サイズが rsize および wsize よりも小さい場合を除き、rsizewsize のマウント オプションによって指定されるサイズで順次 I/O が発生します。
  • ファイルシステム キャッシュをバイパスする操作は、rsize および wsize マウント オプションによって引き続き制約されますが、rsize または wsize で指定された最大値ほど大きくはありません。 directio オプションが指定されたワークロード ジェネレーターを使用する場合、この考慮事項は重要です。

''Azure NetApp Files を使用する際のベスト プラクティスとして、全体的なスループットと待機時間を最適にするために、rsizewsize を 262,144 バイト以下に指定します。''

クローズツーオープンの整合性とキャッシュ属性タイマー

NFS では緩やかな整合性モデルを使用します。 アプリケーションで共有ストレージにアクセスし、使用するたびにデータをフェッチする必要がないため、整合性は緩やかになります。このようなシナリオでは、アプリケーションのパフォーマンスに大きな影響があります。 このプロセスを管理するメカニズムには、キャッシュ属性タイマーとクローズツーオープンの整合性の 2 つがあります。

クライアントにデータの完全な所有権がある場合、つまり、複数のノード間やシステム間で共有されていない場合は、整合性が保証されます。 この場合、ストレージへの getattr アクセス操作を減らし、アプリケーションを高速化できます。そのためには、(マウント オプションとして nocto) クローズツーオープン (cto) 整合性をオフにし、属性キャッシュ管理のタイムアウトをオンにします (マウント オプションとして actimeo=600 を指定すると、タイマーが 10m に変わります。これに対して、既定値は acregmin=3,acregmax=30,acdirmin=30,acdirmax=60)。 一部のテストでは、noctogetattr アクセス呼び出しの約 65 から 70% を減らし、actimeo を調整することで、これらの呼び出しをさらに 20 から 25% 減らします。

属性キャッシュ タイマーのしくみ

acregminacregmaxacdirmin、および acdirmax 属性でキャッシュの整合性を制御します。 前者の 2 つの属性では、ファイルの属性が信頼される期間を制御します。 後者の 2 つの属性では、ディレクトリ ファイル自体の属性 (ディレクトリ サイズ、ディレクトリの所有権、ディレクトリのアクセス許可) が信頼される期間を制御します。 min および max 属性では、ディレクトリの属性、ファイルの属性、ファイルのキャッシュ コンテンツがそれぞれ信頼できると見なされる最小および最大期間を定義します。 minmax との間では、キャッシュされたエントリが信頼される期間を定義するアルゴリズムが使用されます。

たとえば、acregminacregmax の既定値がそれぞれ 3 秒と 30 秒であるとします。 たとえば、ディレクトリ内のファイルに対して属性が繰り返し評価されます。 3 秒が経過すると、鮮度について、NFS サービスに対してクエリが実行されます。 属性が有効と見なされると、クライアントでは信頼される時間が 6 秒、12 秒、24 秒と倍になり、その後、30 秒になります (最大値が 30 に設定されているため)。 この時点から、キャッシュされた属性が古いと見なされるまで (その時点でサイクルがやり直される)、信頼性は acregmax で指定された値である 30 秒として定義されます。

クライアントでデータが読み取り専用として使用され、データ更新が別のパスを介して管理されている場合など、クライアントに完全な所有権がない場合でも、同様のマウント オプション セットのベネフィットが得られる場合があります。 EDA、Web ホスティングおよびムービー レンダリングなどのクライアントのグリッドを使用し、比較的静的なデータ セット (EDA ツールまたはライブラリ、Web コンテンツ、テクスチャ データ) があるアプリケーションの場合、一般的な動作では、データ セットがクライアント上で主にキャッシュされます。 読み取りは少なく、書き込みはありません。 ストレージに戻される getattr とアクセス呼び出しは多数あります。 これらのデータ セットは通常、ファイル システムをマウントしてコンテンツの更新を定期的にプッシュする別のクライアントを通じて更新されます。

このような場合、新しいコンテンツを選択する際に遅延が発生するのがわかっており、アプリケーションでは引き続き古い可能性のあるデータが処理されます。 このような場合は、nocto および actimeo を使用して、古いデータを管理できる期間を制御できます。 たとえば、EDA ツールおよびライブラリでは、actimeo=600 が適しています。このデータは通常は頻繁に更新されないためです。 クライアントでサイトを編集しているときにデータの更新をタイムリーに確認する必要がある小規模な Web ホスティングでは、actimeo=10 を許容できる場合があります。 複数のファイル システムにプッシュされたコンテンツがある大規模な Web サイトでは、actimeo=60 が許容される場合があります。

これらのマウント オプションを使用すると、このような場合のストレージに対するワークロードの負荷が大幅に削減されます (たとえば、最近の EDA エクスペリエンスでは、ツール ボリュームへの IOPS が >150 K 以上から 6 K までに削減されています)。アプリケーションは、メモリ内のデータを信頼できるため、非常に高速に実行できます。 (メモリ アクセス時間はナノ秒で、これに対して、高速ネットワークの getattr とアクセスでは数百マイクロ秒となります)。

クローズツーオープンの整合性

クローズツーオープンの整合性 (cto マウント オプション) を使用すれば、キャッシュの状態に関わらず、ファイルを開いたときに常に最新のデータがアプリケーションに表示されるようになります。

  • ディレクトリがクロールされると (たとえば、lsls -l)、特定の PRC (リモート プロシージャ コール) セットが発行されます。 NFS サーバーでは、そのファイル システムのビューを共有します。 指定された NFS エクスポートにアクセスするすべての NFS クライアントで cto が使用されている限り、すべてのクライアントにファイルとディレクトリの同じリストが表示されます。 ディレクトリ内のファイルの属性の鮮度は、属性キャッシュ タイマーによって制御されます。 つまり、cto が使用されている限り、ファイルは作成されてストレージに配置されるとすぐに、リモート クライアントに表示されます。
  • ファイルが開いている場合、そのファイルのコンテンツは NFS サーバーの観点から最新であることが保証されます。 マシン 2 でファイルが開いているときにマシン 1 からのコンテンツのフラッシュが終了していない競合状態が発生した場合、マシン 2 では、開いている時点でサーバー上に存在するデータのみを受信します。 この場合、マシン 2 では、acreg タイマーに達するまでファイルからさらにデータを取得しません。また、マシン 2 では、再度サーバーからキャッシュの整合性を確認します。 このシナリオは、ファイルがマシン 1 からまだ書き込まれている場合に、マシン 2 から末尾 -f を使用して確認できます。

クローズツーオープンの整合性なし

クローズツーオープンの整合性 (nocto) が使用されていない場合、クライアントでは、キャッシュ属性タイマーに達するまで、ファイルおよびディレクトリの現在のビューの鮮度を信頼します。

  • ディレクトリがクロールされると (たとえば、lsls -l)、特定の PRC (リモート プロシージャ コール) セットが発行されます。 クライアントでは、acdir キャッシュ タイマーの値に達した場合にのみ、ファイルの現在のリストに対してサーバーへの呼び出しを発行します。 この場合、最近作成されたファイルとディレクトリは表示されません。 最近削除されたファイルとディレクトリが表示されます。

  • ファイルが開いている場合、そのファイルがまだキャッシュ内にある限り、NFS サーバーとの整合性が検証されることなく、キャッシュされたコンテンツ (存在する場合) が返されます。

次のステップ