Linux NFS の同時実行

このページでは、NetApp Volumes の Linux NFS クライアントの同時実行性を調整する方法について説明します。

同時実行性は、クライアントとボリュームの間で一度に未処理にできる NFS オペレーションの数です。同時実行性を調整すると、クライアントをサーバーの上限に合わせ、キューの深さが過剰になることによるパフォーマンスの低下を回避できます。

Linux では、同時実行はマウント オプションではなく、スロット テーブル エントリ(NFSv3)または NFSv4.1 セッション スロットによって制御されます。これらの設定は、マウント前に構成するか、変更後に NFS ファイル システムを再マウントします。

nconnect などのマウント オプションについては、Linux NFS マウント オプションをご覧ください。構成順序の詳細については、Linux NFS クライアントを最適化するをご覧ください。

用語

次の主な用語は、Linux NFS の同時実行に関連しています。

  • RPC スロットテーブル: クライアント(NFSv3)での未処理の NFS RPC オペレーションの TCP 接続ごとの上限。

  • セッション スロット: クライアントとサーバー間のセッションでネゴシエートされた未処理のコマンドに関する NFSv4.1 の上限。

  • ストレージ エンドポイント: クライアントがマウントする単一のボリューム IP アドレス。

  • nconnect: 同じエンドポイントに複数の TCP 接続を開くマウント オプション。接続あたりの同時実行数を増やします。

Linux パラメータ

次の表に、各プロトコル バージョンの NFS 同時実行を構成するために使用されるパラメータと構成ファイルを示します。

プロトコル パラメータ 構成
NFSv3 sunrpc.tcp_max_slot_table_entries /etc/sysctl.conf、sysctl -p
NFSv3 sunrpc.tcp_slot_table_entries 一部のディストリビューション。ディストリビューションのドキュメントを参照してください。
NFSv4.1 max_session_slots /etc/modprobe.d/(例: nfsclient.conf)、再起動

NFSv3

以降のセクションでは、NFSv3 クライアントとサーバーの制限、nconnect が同時実行に与える影響、同時実行の要件の見積もり方法、スロット制限の構成方法について説明します。

クライアントとサーバーの上限

NFSv3 では、クライアントとサーバー間の同時実行はネゴシエートされません。各サイドで独自の上限が適用されます。

  • NetApp Volumes NFSv3 サーバー: TCP 接続あたり最大 128 個の実行コンテキスト。

  • 最新の Linux クライアント(デフォルト): sunrpc.tcp_max_slot_table_entries = 65536。

サーバーの上限を超えるデフォルトのクライアント スロット数は不要です。クライアントがサーバーで効率的に処理できる数を超える未処理のオペレーションを送信すると、サーバーは TCP ウィンドウを縮小し、パフォーマンスに影響します。

推奨事項: 接続ごとに sunrpc.tcp_max_slot_table_entries を 128 以下に設定します。クライアントと接続が多い環境では、ストレージ エンドポイントあたりの未処理のスロット使用量の合計を 10,000 以下に維持します。

nconnect が NFSv3 の同時実行に与える影響

1 つのクライアントの最大同時実行数のおおよその値は、次のように計算されます。

(sunrpc.tcp_max_slot_table_entries per connection)×(nconnect value)

同時実行値は、サーバーあたりの接続数(128)とワークロードの要件によって上限が設定されます。

例 1: デフォルト スロット、nconnect なし

  • 1 つの TCP 接続。

  • クライアントは最大 65,536 件の未処理のオペレーションを試行できますが、サーバーは接続ごとに最大 128 件を受け入れます。

  • 有効な同時実行数は、サーバーの上限である 128 に制限されます。

例 2: 128 スロット、nconnect なし

  • sunrpc.tcp_max_slot_table_entries=128

  • 1 つの接続。

  • クライアントとサーバーは 128 個の未処理オペレーションで同期します。

例 3: 100 スロット、nconnect=8

  • 8 つの TCP 接続。

  • 接続ごとに最大 100 個の未処理のオペレーション。

  • 1 つのクライアントからの未処理のオペレーションは最大 800 個(8 × 100)。ただし、接続あたりのサーバー上限は 128 個です。

例 4: 多数のクライアント(EDA スタイル)

  • sunrpc.tcp_max_slot_table_entries=8 を使用するクライアントと nconnect を使用しないクライアントがそれぞれ 250 個。

  • 各クライアントには、接続ごとに最大 8 つの未処理のオペレーションがあります。

  • クライアント全体: 1 つのボリューム IP に対して最大 2,000 件の未処理オペレーション(250 × 8)。これは、10,000 スロットのエンドポイント ガイドラインの範囲内です。

クライアントをスケールアウトする場合は、クライアントあたりのスロット値を小さくします。nconnect は、ファーム全体のスロット計画の代わりではなく、個々の高スループット クライアントで使用します。

リトルの法則を使用して必要な同時実行数を推定する

ワークロードに必要な同時実行数を推定するには、次の式を使用します。

同時実行数 = (オペレーション レート)×(レイテンシ(秒単位))

例: 多数のクライアント、1 つのエンドポイント

平均 I/O が 256 KiB、レイテンシが 10 ミリ秒で 4,000 MiBps を目標とする場合:

  • オペレーション レート: 約 16,000 IOPS。

  • 同時実行性: 約 16,000 × 0.010 = 160。

  • クライアントが 1,250 個の場合: 160 / 1,250 = 約 0.13 スロット / クライアント(均等に分割した場合)。クライアントごとに 2、4、8 などの小さな整数を使用して、10,000 スロットの上限を下回るヘッドルームを維持します。

sunrpc.tcp_max_slot_table_entries を設定する(NFSv3)

多くの Linux ディストリビューションでは、sunrpc カーネル モジュールが読み込まれる前に systemd-sysctl が実行されます。sunrpc.* の /etc/sysctl.conf または /etc/sysctl.d/ のエントリは、起動時に無視されます。次の再起動まで sysctl -p を実行しても、次の永続化方法のいずれかを使用しない限り、効果はありません。

方法 1: テストで 128 より小さい値で十分であることが示された場合は、その値を使用します。ディストリビューションのドキュメントに別の指示がない限り、tcp_slot_table_entries と tcp_max_slot_table_entries の両方を同じ値に設定します。

これらの設定を変更したら、NFS ファイル システムをマウントまたは再マウントします。スロット設定は、設定が有効になった後に作成された RPC トランスポートに適用されます。

方法 2(推奨): /etc/modprobe.d/ のモジュール オプション

モジュール パラメータは、起動後の最初の NFS 使用時に sunrpc が読み込まれるときに適用されます。これらの設定は再起動後も保持されるため、起動時の sysctl 構成は不要です。

  1. /etc/modprobe.d/sunrpc.conf を作成します。

    options sunrpc tcp_slot_table_entries=128 tcp_max_slot_table_entries=128
    
  2. modprobe の変更後にディストリビューションで initramfs の再構築が必要な場合は、再構築します。これは、モジュールが initramfs にある RHEL でよくあることです。詳細については、Linux ベンダーのドキュメントをご覧ください。

  3. アクティブな NFS マウントがなく、ランブックで許可されている場合にのみ、再起動するか、sunrpc をアンロードして再読み込みします。

  4. sunrpc が読み込まれ、意図した値が設定されていることを確認します。

    cat /proc/sys/sunrpc/tcp_slot_table_entries
    cat /proc/sys/sunrpc/tcp_max_slot_table_entries
    
  5. NetApp Volumes エクスポートをマウントまたは再マウントします。

NFSv4.1

以降のセクションでは、NFSv4.1 セッション ネゴシエーションの仕組み、パフォーマンス最適化の例、セッション スロットの上限を構成する方法について説明します。

セッション ネゴシエーション

NFSv4.1 は、クライアントとサーバー間のセッションを確立します。クライアントとサーバーは、サポートされている 2 つの値のうち小さい方を選択して、未処理のコマンドの最大数(max_reqs)をネゴシエートします。

  • NetApp Volumes NFSv4.1 サーバー: セッションあたり 180 個のコマンド。

  • Linux クライアントのデフォルト: 64(max_session_slots)。

  • ネゴシエートされたセッション: クライアントとサーバーの値の最小値。デフォルトのクライアントでは通常 64 です。

サーバーへの各 TCP 接続は、最大 128 個の未処理の NFS コマンドをサポートします。デフォルトのセッション スロットが 64 で、接続が 1 つの場合、同時実行は 64 に制限されます。接続間でより多くのセッション スロットを使用するには、Kerberos 以外のマウントにのみ nconnect=2 以上を使用します。マウント オプションの詳細については、Linux NFS マウント オプションをご覧ください。

例 1: デフォルトの 64 セッション スロット、nconnect なし

  • 1 つの接続。

  • セッションの未処理コマンドは最大 64 個です。

例 2: 64 セッション スロット、nconnect=2

  • セッションは合計 64 スロットに制限され、2 つの接続に分割されます(接続あたり約 32 スロット)。

  • この構成では、合計同時実行数を増やすことなく、接続あたりのキューの深さを減らすことでレイテンシが改善されます。

例 3: max_session_slots=180、nconnect なし

  • セッションでは 180 個のコマンドを使用でき、1 つの接続は 128 個の未処理オペレーションに制限されます。

  • 有効な上限は 128 です。

例 4: max_session_slots=180, nconnect=2

  • セッションでは、2 つの接続で最大 180 個のコマンドを使用できます(接続あたり約 90 個)。

  • この構成は、セッション レベルで単一接続の上限である 128 を超える場合に必要です。

Kerberos を使用せずに NetApp Volumes で NFSv4.1 の最大同時実行数を実現するには、max_session_slots=180 を設定し、nconnect=2 以降を使用します。この構成をワークロードでテストします。

NFSv4.1 の最大セッション スロットを設定する

  1. /etc/modprobe.d/nfsclient.conf を作成します。

    options nfs max_session_slots=180
    
  2. クライアントを再起動します。

  3. 少なくとも 1 つの NFSv4.1 マウントが存在することを確認します。

    systool -v -m nfs
    
  4. 出力に max_session_slots が表示されていることを確認します。

これらの変更には、標準の Linux NFS クライアント パッケージの再起動が必要です。メンテナンスを適宜計画してください。

マルチクライアントと大容量のボリューム

  • 複数の VM、1 つのボリューム IP: クライアントあたりの sunrpc.tcp_max_slot_table_entries を削減します。

  • 複数の IP を持つ大容量ボリューム: スロットの上限は、クライアントと IP の接続ごとに適用されます。可能な場合は、クライアントをエンドポイントに分散します。詳細については、複数のストレージ エンドポイントを持つ大容量ボリュームを接続するをご覧ください。

次のステップ