このページでは、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=1281 つの接続。
クライアントとサーバーは 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 構成は不要です。
/etc/modprobe.d/sunrpc.confを作成します。options sunrpc tcp_slot_table_entries=128 tcp_max_slot_table_entries=128
modprobe の変更後にディストリビューションで initramfs の再構築が必要な場合は、再構築します。これは、モジュールが initramfs にある RHEL でよくあることです。詳細については、Linux ベンダーのドキュメントをご覧ください。
アクティブな NFS マウントがなく、ランブックで許可されている場合にのみ、再起動するか、
sunrpcをアンロードして再読み込みします。sunrpcが読み込まれ、意図した値が設定されていることを確認します。cat /proc/sys/sunrpc/tcp_slot_table_entries cat /proc/sys/sunrpc/tcp_max_slot_table_entries
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 の最大セッション スロットを設定する
/etc/modprobe.d/nfsclient.confを作成します。options nfs max_session_slots=180
クライアントを再起動します。
少なくとも 1 つの NFSv4.1 マウントが存在することを確認します。
systool -v -m nfs
出力に
max_session_slotsが表示されていることを確認します。
これらの変更には、標準の Linux NFS クライアント パッケージの再起動が必要です。メンテナンスを適宜計画してください。
マルチクライアントと大容量のボリューム
複数の VM、1 つのボリューム IP: クライアントあたりの
sunrpc.tcp_max_slot_table_entriesを削減します。複数の IP を持つ大容量ボリューム: スロットの上限は、クライアントと IP の接続ごとに適用されます。可能な場合は、クライアントをエンドポイントに分散します。詳細については、複数のストレージ エンドポイントを持つ大容量ボリュームを接続するをご覧ください。