このトピックでは、共有メモリ通信 (SMC) を有効化する方法、SMC アクセラレーション範囲を構成する方法、および SMC によって公開されるインターフェイスを構成して最適なアクセラレーション効果を実現する方法について説明します。
Alibaba Cloud ECS で SMC を使用する
Alibaba Cloud Linux 3 は、RDMA (SMC-R) カーネル [プロトコルスタック] 上で SMC を提供および最適化します。次の手順を実行することで、SMC-R を使用できます。
準備
eRDMA ネットワークインターフェース (ERI) をサポートする Elastic Compute Service (ECS) インスタンスを作成します。
SMC-R は、リモートダイレクトメモリアクセス (RDMA) に依存しています。Alibaba Cloud で SMC-R を使用するには、ERI 機能をサポートする ECS インスタンスを作成して、クラウドで Elastic RDMA (eRDMA) 機能を取得する必要があります。詳細については、「エンタープライズレベルインスタンスで eRDMA を有効にする」をご参照ください。
重要Alibaba Cloud eRDMA デバイスと SMC は、IPv6 アドレスをサポートしていません。アプリケーションが IPv6 を使用する場合、SMC は TCP にフォールバックします。詳細については、「IPv6 アドレスが使用されている場合、SMC は TCP にフォールバックする」をご参照ください。
カーネルバージョン
ANCK 5.10.134-17.3以降、SMC はIPv4-mapped IPv6アドレスをサポートしています。
次のコマンドを実行して、
smcおよびsmc_diagカーネルモジュールをロードします。sudo modprobe smc sudo modprobe smc_diagdmesgコマンドを実行して、カーネル関連のメッセージを表示します。カーネルモジュールがロードされている場合、次の情報が表示されます。smc: smc: load SMC module with reserve_mode NET: Registered protocol family 43 smc: netns <netns ID> reserved ports [65500 ~ 65515] for eRDMA OOB smc: adding ib device erdma_0 with port count 1 smc: ib device erdma_0 port 1 has pnetid(オプション) SMC を使用しなくなった場合は、次のコマンドを実行して SMC モジュールをアンインストールします。
sudo rmmod smc_diag sudo rmmod smc次のコマンドを実行して、
smc-toolsおよびaliyun-smc-extensionsO&M ツールセットをインストールします。sudo yum install -y smc-tools sudo yum install -y aliyun-smc-extensions
SMC スタックで TCP ソケットアプリケーションを実行する
Alibaba Cloud Linux 3 SMC-R を使用すると、[ネット名前空間] レベルおよびプロセスレベルでアプリケーションを TCP ソケットから SMC ソケットに変換できます。
ネット名前空間レベルのソケット変換
Alibaba Cloud Linux 3 は、net namespace レベルの透過的なソケット変換機能を提供します。この機能を使用すると、sysctl net.smc.tcp2smc コマンドを実行することで、net namespace 内の次の条件を満たすすべての TCP ソケットを SMC ソケットに変換できます。
familyの値は AF_INET です。typeの値は SOCK_STREAM です。protocolの値は IPPROTO_IP(0) または IPPROTO_TCP(6) です。
次の図は、変換プロセスを示しています。
net namespace レベルの透過的なソケット変換を実行するには、次の手順を実行します。
次のコマンドを実行して
net.smc.tcp2smcを 1 に設定し、現在のnet namespaceの透過的なソケット変換を有効にします。net namespaceの透過的なソケット変換が有効になると、net namespace内の以降の新しい TCP ソケットは SMC ソケットに変換されます。既存の TCP ソケットは影響を受けません。sudo sysctl net.smc.tcp2smc=1デフォルトでは、
sysctl net.smc.tcp2smcは 0 に設定されています。これは、透過的なソケット変換が無効になっていることを示します。次のコマンドを実行して、現在の
net namespaceで TCP ソケットアプリケーションを実行します。次のコマンドでは、
fooを実際のアプリケーション名に置き換えます。./<foo>fooアプリケーションによって作成された TCP ソケットは透過的に SMC ソケットに置き換えられ、アプリケーションのネットワーク動作は SMC-R スタックによって処理されます。「概要」で説明されているように、ピアも SMC-R をサポートし、ネゴシエーションが成功した場合、データは RDMA ネットワークを介してローカルノードとピアノード間で転送されます。そうでない場合、ノードは安全に TCP にフォールバックしてデータ転送を行います。(オプション) 次のコマンドを実行して、現在の
net namespaceの透過的なソケット変換を無効にします。net namespaceの透過的なソケット変換が無効になると、net namespace内の以降の新しい TCP ソケットは SMC ソケットに変換されなくなりますが、既存の変換済み SMC ソケットは影響を受けます。sudo sysctl net.smc.tcp2smc=0
プロセスレベルのソケット変換
Alibaba Cloud Linux 3 は、smc-tools ツールセットに基づいて、プロセスレベルの透過的なソケット変換機能も提供します。
smc-tools ツールセットの smc_run スクリプトを使用してアプリケーションを実行できます。smc_run は、LD_PRELOAD [環境変数] を使用して、smc-tools ツールセットの libsmc-preload.so を最初にロードする動的ライブラリとして定義します。libsmc-preload.so は、アプリケーションとその [子プロセス] 内の次の条件を満たす TCP ソケットを SMC ソケットに変換します。
familyの値は AF_INET です。typeの値は SOCK_STREAM です。protocolの値は IPPROTO_IP(0) または IPPROTO_TCP(6) です。
smc_run は LD_PRELOAD を使用して glibc の socket() システムコールをインターセプトするため、glibc を使用しないアプリケーションや静的にリンクされたアプリケーションには使用できません。
次の図は、変換プロセスを示しています。
プロセスレベルの透過的なソケット変換を実行するには、次の操作を実行します。
次のコマンドを実行して、foo アプリケーションの実行可能ファイルの前に smc_run プレフィックスを追加します。
次のコマンドでは、foo を実際のプロセス名に置き換えます。
smc_run ./<foo>foo アプリケーションによって作成された TCP ソケットは透過的に SMC ソケットに置き換えられ、アプリケーションのネットワーク動作は SMC-R スタックによって処理されます。「概要」で説明されているように、ピアも SMC-R をサポートし、ネゴシエーションが成功した場合、データは RDMA ネットワークを介してローカルノードとピアノード間で転送されます。そうでない場合、ノードは安全に TCP にフォールバックしてデータ転送を行います。
BPF ポリシーに基づく SMC ネゴシエーション制御
実際の使用では、net namespace またはプロセスレベルで SMC を有効にしても、粒度が粗すぎる場合があります。たとえば、サーバーに net namespace 内に複数のネットワーク リスニング ポートがある場合、パフォーマンスの高速化が必要なポートの接続にのみ SMC を使用し、管理ポートなど、他のポートの接続には TCP に安全にフォールバックすることができます。
この目的のために、Alibaba Cloud Linux 3 は、Berkeley Packet Filter(BPF)テクノロジーを使用して、net namespace レベルまたはプロセスレベルの透過的なソケット変換に基づいて、接続に SMC ネゴシエーションを使用するかどうかをさらに制御することをサポートしています。一般的なプロセスは次のとおりです。
BPF ポリシーを設定および有効化して、きめ細かい SMC ネゴシエーション制御を設定します。
net namespaceまたはプロセスレベルで SMC を有効にします。詳細については、「SMC スタックで TCP ソケット アプリケーションを実行する」をご参照ください。
概要で説明されているように、TCP 接続のハンドシェイク プロセス中に、両方の通信パーティは特別な TCP オプションを使用して SMC-R のサポートを示し、ピアも SMC-R をサポートしているかどうかを確認します。ネゴシエーションが成功すると、2 つのパーティ間の後続のネットワーク送信は RDMA を介して完了します。そうでない場合、システムは安全に TCP にフォールバックします。
デフォルトでは、SMC ソケットは常に特別な TCP オプションを開始および応答します。ただし、BPF テクノロジーを使用して、ポートまたは IPv4 アドレス ポリシーに基づいて特別な TCP オプションを開始または応答するかどうかをさらに制御することで、よりきめ細かい SMC 有効化制御を実現できます。
この目的のために、Alibaba Cloud Linux 3 は、BPF ポリシーを設定および有効化するための smc-tools に smc-ebpf ツールを提供しています。
次のコマンドを実行して、smc-ebpf ツールがインストールされているかどうかを確認します。
smc-ebpf policy help次のコマンド出力は、smc-ebpf ツールがインストールされていることを示しています。
smc-ebpf policy help
Usage: smc-ebpf policy COMMAND [OPTIONS]
smc-ebpf policy load [OPTIONS] // ポリシーのロード
--init // 事前定義された設定でポリシーをロード
smc-ebpf policy stop // ポリシーの停止
smc-ebpf policy unload // ポリシーのアンロード
smc-ebpf policy init // デフォルト設定でポリシーを初期化
smc-ebpf policy clear // すべてのポリシー設定をクリア
smc-ebpf policy dump // すべてのポリシー設定を表示
smc-ebpf policy config [OPTIONS] // ポリシーの設定
smc-ebpf policy delete [OPTIONS] // ポリシーの削除
--ip [IPv4] // ターゲット IPv4 アドレス
--port // ターゲット ポート
--mode [auto|disable|enable] // ターゲット モード
Examples:
smc-ebpf policy load
#disable port 80 to use smc // ポート 80 で smc を使用不可にする
smc-ebpf policy config --port 80 --mode disable
#delete ip xxx.xxx.x.x/24 policy // IP xxx.xxx.x.x/24 ポリシーを削除する
smc-ebpf policy delete --ip xxx.xxx.x.x --mask 24smc-ebpf ツールのロード
次のコマンドを実行して、smc-ebpf ツールをロードします。
sudo smc-ebpf policy loadsmc-ebpfツールは、設定対象の接続が作成される前にロードする必要があります。ロード前に作成された接続に対しては、smc-ebpfツールは有効になりません。smc-ebpfツールによって設定されたポリシーはグローバル ポリシーであり、特定のネット名前空間(コンテナー)に対して個別に設定することはできません。smc-ebpfツール関連の機能は、アップストリーム コミュニティでまだ継続的に標準化されており、将来的にインターフェイスが変更される可能性があります。現在、これらの機能は実験的な機能としてのみ提供されています。
次のコマンド出力は、
smc-ebpfツールがロードされていることを示しています。# sudo smc-ebpf policy load Registered smc_sock_negotiator_ops anolis_smc id xxx // smc_sock_negotiator_ops anolis_smc id xxx を登録しました異なるコマンド出力は、現在の環境ではツールを使用できないことを示しています。問題のトラブルシューティングを行うには、次の操作を実行します。
オペレーティング システム カーネルのバージョンが
ANCK 5.10.134-016以降であることを確認します。uname -rコマンドを使用して、カーネル バージョンを表示できます。BPF プログラムをロードする権限があることを確認します。一般的な理由は、使用しているポッド コンテナーに BPF プログラムをロードする機能がないか、権限レベルが不十分である可能性があります。詳細については、環境プロバイダーにお問い合わせください。
ポート ポリシーのデフォルトの動作
smc-ebpf ツールがロードされた後、ターゲット ポートに一致するポート ポリシーがない場合、ターゲット ポートは SMC ネゴシエーションの使用が禁止されます。
例:
ポート ポリシーを設定せずに
smc-ebpfツールをロードした場合、すべてのポートで SMC ネゴシエーションの使用が禁止されます。ポート 80 で SMC ネゴシエーションの使用を許可するポリシーのみで
smc-ebpfツールをロードした場合、ポート 8080 など、使用中の他のポートは、ポート 8080 に一致するポリシーがないため、SMC ネゴシエーションの使用が禁止されます。
具体的には、ポート 0 の --mode を enable に設定する次のコマンドを実行して、ポート ポリシーがポートに一致しない場合のデフォルトの動作を SMC ネゴシエーションの使用を許可するように変更できます。
sudo smc-ebpf policy config --port 0 --mode enable同様に、ポート 0 の --mode を disable に設定する次のコマンドを実行して、ポート ポリシーがポートに一致しない場合のデフォルトの動作を SMC ネゴシエーションの使用を禁止するように戻すことができます。
sudo smc-ebpf policy config --port 0 --mode disableポート ポリシーの設定
デフォルトの動作に基づいて、特定のポートのポリシーを追加できます。
例:
例 1: ポート 80 のみが SMC ネゴシエーションを使用できるようにし、他のすべてのポートは SMC ネゴシエーションの使用を禁止します。
ポート 80 で SMC ネゴシエーションの使用を許可するポリシーを追加するには、次のコマンドを実行します。
sudo smc-ebpf policy config --port 80 --mode enableポート ポリシーが追加されているかどうかを確認するには、次のコマンドを実行します。
sudo smc-ebpf policy dumpコマンド出力の例:
"key": 80は、ポリシーがポート 80 を対象としていることを示します。"mode":は、SMC ネゴシエーションの使用が許可されているかどうかを示します。値2は SMC ネゴシエーションの使用が許可されていることを示し、値0は SMC ネゴシエーションの使用が禁止されていることを示します。
# sudo smc-ebpf policy dump [{ "key": 80, "value": { "mode": 2, // 一般ユーザーが注意を払う必要のないその他のフィールド } } ]ポリシーが不要になった場合は、次のコマンドを実行してポート 80 のポリシーを削除します。
sudo smc-ebpf policy delete --port 80dumpコマンドを再度実行します。次のコマンド出力は、ポリシーが削除されたことを示しています。# sudo smc-ebpf policy dump []例 2: ポート 80 で SMC ネゴシエーションの使用を禁止し、他のすべてのポートは SMC ネゴシエーションの使用を許可します。
次のコマンドを実行して、ポート ポリシーがターゲット ポートに一致しない場合のデフォルトの動作を SMC ネゴシエーションの使用を許可するように変更し、ポート 80 で SMC ネゴシエーションの使用を禁止するポリシーを追加します。
sudo smc-ebpf policy config --port 0 --mode enable sudo smc-ebpf policy config --port 80 --mode disable上記のコマンドを実行した後、ポート 80 のみが SMC ネゴシエーションの使用を禁止され、ポート ポリシーがポートに一致しない場合、他のすべてのポートは SMC ネゴシエーションの使用が許可されます。
IPv4 アドレス ポリシーのデフォルトの動作
ポート ポリシーとは異なり、IPv4 アドレス ポリシーはクライアント ソケットにのみ有効であり、サーバーの IPv4 アドレスに基づいてクライアントがサーバーに接続するときに SMC ネゴシエーションを使用するかどうかを制御するために使用されます。
設定されたすべてのポート ポリシーと IPv4 アドレス ポリシーは、論理 AND を使用して評価されます。SMC ネゴシエーションは、接続に一致するすべてのポリシーで SMC ネゴシエーションの使用が許可されている場合にのみ使用されます。一致するポリシーで SMC ネゴシエーションの使用が禁止されている場合、SMC ネゴシエーションは使用されません。
smc-ebpf ツールがロードされた後、ターゲット サーバーの IP アドレスに一致する IPv4 アドレス ポリシーがない場合、クライアントはターゲット サーバーの IP アドレスに対して SMC ネゴシエーションを使用することが許可されます。
例:
IPv4 アドレス ポリシーを設定せずに
smc-ebpfツールをロードした場合、クライアント ソケットはすべてのサーバー IP アドレスに接続するときに SMC ネゴシエーションを使用することが許可されます。smc-ebpfツールをロードした後、ツールは192.168.1.0/24へのアクセスに対して SMC ネゴシエーションの使用を禁止するポリシーのみを設定します。この場合、192.168.3.11に一致するポリシーはなく、192.168.3.11にアクセスするときに SMC ネゴシエーションが許可されます。
具体的には、0.0.0.0/32 の --mode を disable に設定する次のコマンドを実行して、サーバーの IP アドレスに一致する IPv4 アドレス ポリシーがない場合のデフォルトの動作を SMC ネゴシエーションの使用を禁止するように変更できます。
sudo smc-ebpf policy config --ip 0.0.0.0 --mask 32 --mode disable同様に、0.0.0.0/32 の --mode を enable に設定する次のコマンドを実行して、サーバーの IP アドレスに一致する IPv4 アドレス ポリシーがない場合のデフォルトの動作を SMC ネゴシエーションの使用を許可するように戻すことができます。
sudo smc-ebpf policy config --ip 0.0.0.0 --mask 32 --mode enableIPv4 アドレス ポリシーの設定
デフォルトの動作に基づいて IPv4 アドレス ポリシーを設定して、クライアントが特定のサーバー IP アドレスに接続するときに SMC ネゴシエーションを使用するかどうかを制御できます。
設定された IPv4 アドレス ポリシーは、クライアント ソケットがサーバー IPv4 アドレスに接続するときにクライアントが SMC ネゴシエーションを使用するかどうかのみを制御します。サーバー ソケットが SMC ネゴシエーションを使用するかどうかは、IPv4 アドレス ポリシーの影響を受けません。
例:
例 1: クライアントが 192.168.2.0/24 に接続するときにのみ SMC ネゴシエーションを使用できるようにし、他のサーバー IP アドレスにアクセスするときは SMC ネゴシエーションの使用を禁止します。
0.0.0.0/32の --mode をdisableに設定する次のコマンドを実行して、サーバーの IP アドレスに一致する IPv4 アドレス ポリシーがない場合のデフォルトの動作を SMC ネゴシエーションの使用を禁止するように変更し、192.168.2.0/24 のサーバー IP アドレスに対して SMC ネゴシエーションの使用を許可するポリシーを追加します。sudo smc-ebpf policy config --ip 0.0.0.0 --mask 32 --mode disable sudo smc-ebpf policy config --ip 192.168.2.0 --mask 24 --mode enableIPv4 ポリシー設定を表示するには、次のコマンドを実行します。
sudo smc-ebpf policy dumpコマンド出力の例:
key: ポリシーの対象となる IPv4 アドレスを示します。value: SMC ネゴシエーションの使用が許可されているかどうかを示します。値passは SMC ネゴシエーションの使用が許可されていることを示し、値deniedは SMC ネゴシエーションの使用が禁止されていることを示します。
# sudo smc-ebpf policy dump key: 0.0.0.0/32 value: "denied" // キー: 0.0.0.0/32 値: "denied" key: 192.168.2.0/24 value: "pass" // キー: 192.168.2.0/24 値: "pass"上記の IPv4 アドレス ポリシーが不要になった場合は、次のコマンドを実行して
0.0.0.0/32と192.168.2.0/24のポリシーを削除します。sudo smc-ebpf policy delete --ip 192.168.2.0 --mask 24 sudo smc-ebpf policy delete --ip 0.0.0.0 --mask 32例 2: クライアントが
192.168.2.0/24に接続するときにのみ SMC ネゴシエーションの使用を禁止し、他のサーバー IP アドレスにアクセスするときは SMC ネゴシエーションの使用を許可します。192.168.2.0/24のサーバー IP アドレスに対して SMC ネゴシエーションの使用を禁止するポリシーを追加するには、次のコマンドを実行します。sudo smc-ebpf policy config --ip 192.168.2.0 --mask 24 --mode disablesmc-ebpfツールがロードされた後、ターゲット サーバーの IP アドレスに一致する IPv4 アドレス ポリシーがない場合、クライアントはターゲット サーバーの IP アドレスに対して SMC ネゴシエーションを使用することが許可されるため、他の操作は必要ありません。192.168.2.0/24以外のサーバー IP アドレスに対しては、SMC ネゴシエーションの使用が許可されます。
ポリシーのクリア
設定されているすべてのポリシーをクリアするには、次のコマンドを実行します。
sudo smc-ebpf policy clear上記のコマンドを実行した後、設定されているすべてのポリシーが削除され、デフォルトの動作が SMC ネゴシエーションの禁止に戻ります。この場合、すべてのポートで SMC ネゴシエーションの使用が禁止され、すべての IPv4 アドレスで SMC ネゴシエーションの使用が許可されます。ポート ポリシーと IPv4 アドレス ポリシーは、論理 AND を使用して評価されます。その結果、すべての接続で SMC ネゴシエーションの使用が禁止されます。
Alibaba Cloud ACK で SMC を使用する
Alibaba Cloud Container Service for Kubernetes (ACK) では、ACK eRDMA Controller コンポーネントを使用して SMC を有効にできます。eRDMA Controller は、ERI の管理とスケジュールに使用され、ポッドにネットワーク機能を提供します。詳細については、「シナリオ 2: SMC-R を使用してアプリケーション ネットワークを高速化する」をご参照ください。
Alibaba Cloud ECS で SMC を使用する場合と同様に、Alibaba Cloud ACK で SMC を使用する場合も、ノードで SMC を有効にするための BPF ベースの詳細ポリシーを構成できます。Alibaba Cloud ECS での SMC の使用。
パラメーター
SMC スタックは、sysfs や smc-tools などのユーザーモードツールを使用して、さまざまな構成インターフェイスを提供します。SMC の構成可能な機能について、以下に説明します。
sysfs を使用して以下のパラメーターを構成する
カーネルパラメーター | 説明 | サポートされているカーネルバージョン | 構成の推奨事項 |
net.smc.autocorking_size | SMC-R は、TCP autocork に類似した autocork 機能を提供します。 autocork 機能は、複数の小さなパケットをまとめて大きなパケットに集約し、1 回の送信操作で送信します。これにより、ピンポンレイテンシに影響を与えることなく、小さなパケットシナリオでのスループットが向上します。 net.smc.autocorking_size パラメーターは、集約されたパケットサイズの 上限 を指定します。 デフォルト値:65535。 有効な値:0 ~ 4294967295。値 0 は、機能が無効になっていることを示します。 | カーネルバージョン: | 帯域幅が重要な小さなパケットシナリオでは、このパラメーターを適切な値に設定して、最適な帯域幅効果を実現できます。 レイテンシが重要な |
net.smc.autosplit_size | SMC は autosplit 機能を提供します。これは、大きなパケットを複数の小さなパケットに分割してバッチ送信することで、レイテンシを向上させます。パケットのサイズが net.smc.autosplit_size パラメーターの値の 1.3 倍を超えると、パケットは分割されます。 デフォルト値:131072。 有効な値:32768 ~ 536870912。 | カーネルバージョン:
| レイテンシが重要な大きなパケットシナリオでは、このパラメーターを適切に調整して、最適なレイテンシ効果を実現できます。 |
net.smc.experiment_vendor_options | Alibaba Cloud の実験的な機能オプション。 デフォルト値:4294967295 (0xFFFFFFFF)。 | カーネルバージョン: | デフォルト値を保持することをお勧めします。 |
net.smc.global_mem | SMC のシステムレベルのメモリ使用量しきい値。SMC スタックによって維持される送受信バッファーのサイズが デフォルト値:[システムレベルメモリの 25%、システムレベルメモリの 50%、システムレベルメモリの 75%]。 | カーネルバージョン:
| 予想されるメモリレベルに基づいて |
net.smc.limit_smc_hs | 接続圧力が高い場合に TCP にフォールバックするかどうかを制御します。 デフォルト値:1。 有効な値:
| カーネルバージョン:
| このパラメーターを 1 に設定することをお勧めします。 接続圧力に基づいて SMC スタックをフォールバックさせたくないシナリオでは、このパラメーターを 0 に設定できます。 |
net.smc.mem | 現在の デフォルト値:[システムレベルメモリの 25%、システムレベルメモリの 50%、システムレベルメモリの 75%]。 | カーネルバージョン:
| 予想されるメモリレベルに基づいて |
net.smc.rmem | SMC ソケットのデフォルトの受信バッファーサイズ。 デフォルト値:262144。 有効な値:
| カーネルバージョン: |
詳細については、「SMC の監視」をご参照ください。 |
net.smc.wmem | SMC ソケットのデフォルトの送信バッファーサイズ。 デフォルト値:262144。 有効な値:
| カーネルバージョン: |
詳細については、「SMC の監視」をご参照ください。 |
net.smc.smcr_buf_type | SMC-R 送受信バッファーのメモリタイプ。物理的に連続したメモリを使用するとパフォーマンスが向上しますが、物理的に連続したメモリは通常取得が難しく、予想よりも小さいバッファーになる可能性があります。逆に、仮想的に連続したメモリは取得しやすいですが、パフォーマンスはわずかに劣ります。 このパラメーターの値を変更した後、新しいリンクグループによって伝送される SMC 接続に対して有効になり、既存のリンクグループは影響を受けません。 デフォルト値:2。 有効な値:
| カーネルバージョン: | デフォルト値を保持することをお勧めします。 |
net.smc.smcr_max_conns_per_lgr | SMC-R リンクグループに含まれる SMC 接続の最大数。 デフォルト値:32。 有効な値:
| カーネルバージョン: | 変更は慎重に行ってください。
|
net.smc.smcr_max_links_per_lgr | SMC-R リンクグループに含まれる RDMA 可靠接続 (RC) (SMC リンク) の数。 デフォルト値:1。 有効な値:1 および 2。 | カーネルバージョン: | デフォルト値を保持することをお勧めします。 |
net.smc.smcr_testlink_time | SMC-R の RDMA RC 接続 (SMC リンク) のハートビートパケット間隔 (秒単位)。SMC リンクでデータが送信されていない場合、 デフォルト値:30。 有効な値:0 ~ 2147483647。値 0 は、ハートビートチェックが無効になっていることを示します。 | カーネルバージョン: | デフォルト値を保持することをお勧めします。 |
net.smc.tcp2smc | 現在の デフォルト値:0。 有効な値:
| カーネルバージョン: |
|
EID の構成
エンタープライズ ID(EID)は、SMCv2 プロトコルで導入された概念です。同じ EID で構成されたシステムのみが SMCv2 を使用して通信できます。そうでない場合は、TCP にフォールバックします。システムは最大 8 つの EID で構成できます。
Alibaba Cloud Linux 3 では、eRDMA デバイスは SMCv2 プロトコルでのみ使用できます。Alibaba Cloud Linux 3 は、初期状態で EID SMCV2-DEFAULT-UEID で構成されています。したがって、初期状態のすべての Alibaba Cloud Linux 3 ノードは、追加の手動構成なしで SMCv2 を使用して eRDMA デバイスと通信できます。
特別な場合に EID を変更して通信範囲を制御する場合は、次の手順を実行します。
既存の EID を表示します。
smcr ueid show新しい EID を追加します。
EIDは最大 32 文字で、大文字、数字、ハイフン(-)、およびピリオド(.)を含めることができます。EIDは文字または数字で始まり、連続したピリオド(..)を含めることはできません。sudo smcr ueid add <EID>既存の EID を削除します。
sudo smcr ueid del <EID>
ユースケース:EID を使用してゾーン間の SMC-R 通信を防止する
パフォーマンスの向上に SMC-R を活用するには、同じゾーン内では SMC-R を使用し、ゾーン間では TCP 通信を使用することをお勧めします。ゾーン ID を EID として追加することで、同じゾーン内での SMC-R と、ゾーン間での TCP への自動フォールバックを実装できます。
方法 1:EID をステップバイステップで構成する
次のコマンドを実行して、Alibaba Cloud ECS インスタンスメタデータからゾーン ID を取得します。
ZONE_ID=$(curl -s -m 1 100.100.100.200/latest/meta-data/zone-id | tr "[:lower:]" "[:upper:]")次のコマンドを実行して、ゾーン ID を EID として追加します。
sudo smcr ueid add $ZONE_ID次のコマンドを実行して、
SMCV2-DEFAULT-UEID値を削除します。smcr ueid | grep SMCV2-DEFAULT-UEID > /dev/null && sudo smcr ueid del SMCV2-DEFAULT-UEID
方法 2:
aliyun-smc-extensionsツールのaliyunsmc-ueidサービスを使用して、ワンクリックで EID を構成する次のコマンドを実行して、
aliyunsmc-ueidサービスを開始します。このサービスは、ゾーン ID を EID として自動的に追加し、デフォルトの EID を削除します。sudo systemctl start aliyunsmc-ueid(オプション)次のコマンドを実行して、
aliyunsmc-ueidサービスが起動時に自動的に開始されるように構成します。これは、EID の構成が永続的ではなく、オペレーティングシステムの再起動時にデフォルトの状態に復元されるためです。sudo systemctl enable aliyunsmc-ueid
物理ネットワーク識別子(PNET ID)を設定する
TCP 通信では、ネットワークトラフィックはイーサネットインターフェイスを介して出入りします。 TCP 通信が透過的に SMC-R 通信に変換されると、SMC-R スタックはイーサネットインターフェイスに関連付けられた ERI を使用します。
この関連付けには、次の 2 つの形式があります。
ターゲットのイーサネットインターフェイスで eRDMA を有効にすることで ERI を取得した後、SMC-R スタックはイーサネットインターフェイスを ERI に自動的に関連付けます。
イーサネットインターフェイスで eRDMA が有効になっているかどうかを確認するには、「ERI を表示する」をご参照ください。
イーサネットインターフェイスを作成するときに eRDMA を有効にするには、「ERI を作成する」をご参照ください。
既存のイーサネットインターフェイスに対して eRDMA を有効にするには、「既存の ENI の ERI 機能のステータスを変更する」をご参照ください。
この場合、SMC-R スタックは、追加の操作なしで、イーサネットインターフェイスに関連付けられた ERI を自動的に識別して使用できます。
他のイーサネットインターフェイスで eRDMA を有効にすることで ERI を取得した後は、PNET ID を使用して ERI をイーサネットインターフェイスに関連付ける必要があります。
例:
ノードに
eth0とeth1という名前のイーサネットインターフェイスがあり、eth0で eRDMA が有効になっていて、erdma_0という名前の ERI に関連付けられています。TCP トラフィックが
eth0を介して送受信され、透過的な TCP から SMC への変換が発生した場合、SMC-R スタックは関連付けられたerdma_0ERI を自動的に検出し、RDMA ネットワークを通信に使用できます。これは、上記で説明した自動関連付けの最初のケースです。TCP トラフィックが
eth1を介して送受信され、透過的な TCP から SMC への変換が発生した場合、SMC-R スタックはerdma_0ERI を自動的に検出できず、TCP にフォールバックします。この場合、同じ PNET ID を使用してeth1をerdma_0に関連付けることで、eth1のトラフィックを伝送するためにerdma_0を使用できることを SMC-R に通知できます。PNET ID を使用してイーサネットインターフェイスと ERI を関連付けるには、次の手順を実行します。
イーサネットインターフェイスと ERI に同じ PNET ID を設定します。
次のコマンドを実行して、イーサネットインターフェイスの PNET ID を設定します。
sudo smc_pnet -a <PNET ID> -I <eth_interface>次のコマンドを実行して、ERI に同じ PNET ID を設定します。
sudo smc_pnet -a <PNET ID> -D <rdma_interface>
PNET ID は最大 16 文字で、大文字と数字を含めることができます。スペースは使用できません。
次のコマンドを実行して、PNET ID を表示します。
# sudo smc_pnetコマンド出力の例:
# sudo smc_pnet 00163E0CD751 n/a erdma_0 1 00163E0CD751 eth1 n/a 255前の例では、PNET ID 00163E0CD751 は
erdma_0とeth1にアタッチされています。このようにして、もともとeth1を介してデータを送受信する TCP スタックは、SMC-R が有効になった後、erdma_0を介してデータを送受信できます。
ユースケース: PNET ID を使用してポッドのイーサネットインターフェイスをホストの ERI に関連付ける
複数のポッドがホスト上の 1 つ以上の ERI を共有するセルフビルドコンテナシナリオでは、ポッドの仮想イーサネットインターフェイス(vEth)とホストの ERI に同じ PNET ID を設定できます。このようにして、コンテナで SMC-R が有効になった後、カーネルプロトコルスタックはホストの ERI を正しく検出し、RDMA ネットワークを使用してコンテナ内の vEth のネットワークトラフィックを高速化できます。
次の手順を実行します。
コンテナの
net 名前空間で、eth0などの vEth の PNET ID を設定します。sudo ip netns exec <pod netns> smc_pnet -a <PNET ID> -I eth0ホストの
net 名前空間で、erdma_0などの ERI の PNET ID を設定します。sudo smc_pnet -a <PNET ID> -D erdma_0
ユースケース: ECS と Redis を使用するシナリオで SMC を使用する
2 つの ECS インスタンスを作成します。1 つは Redis クライアント、もう 1 つは Redis サーバーとして使用します。ECS インスタンスの作成方法については、「カスタム起動タブでインスタンスを作成する」をご参照ください。
次のコマンドを実行して、
smcおよびsmc_diagカーネルモジュールをロードします。sudo modprobe smc sudo modprobe smc_diag次のコマンドを実行して、ECS インスタンスに Redis をインストールします。
sudo yum install redis -y次のコマンドを ECS インスタンスで実行して、EID を使用してゾーン間の SMC-R 通信を防止します。
sudo systemctl start aliyunsmc-ueidECS インスタンスで、接続されている
vSwitchの CIDR ブロック内にあるサーバー IP アドレスとサーバーポート6379に関連付けられている場合にのみ、SMC ネゴシエーションを使用する接続を許可するポートベースの BPF ポリシーを設定します。smc-ebpfツールをロードします。sudo smc-ebpf policy loadポート
6379のみが SMC ネゴシエーションを使用できるようにするポートポリシーを追加します。sudo smc-ebpf policy config --port 6379 --mode enableRedis サーバーに接続されている
vSwitchの CIDR ブロック内のサーバー IP アドレスに対して SMC ネゴシエーションの使用を許可する IPv4 アドレスポリシーを追加します。sudo smc-ebpf policy config --ip 0.0.0.0 --mask 32 --mode disable cidr=$(curl -s -m 1 100.100.100.200/latest/meta-data/vswitch-cidr-block) sudo smc-ebpf policy config --ip \ $(echo ${cidr} | awk -F'/' '{print $1}') --mask \ $(echo ${cidr} | awk -F'/' '{print $2}') --enable;
次のコマンドを ECS インスタンスで実行して、現在の
net 名前空間で透過的なソケット変換を有効にします。sudo sysctl -w net.smc.tcp2smc=1次のコマンドを Redis サーバーで実行して、Redis サービスを開始します。
<
IP> は、Redis サーバーにバインドされているプライマリ ENI (Elastic Network Interface) のプライベート IP アドレスに置き換えます。redis-server --bind <IP> --port 6379 --protected-mode no --saveRedis クライアントで Redis サーバーに接続するか、テストします。
次のコマンドを実行して、Redis サーバーに接続します。
redis-cli -h <IP> -p 6379次のコマンドを実行して、
redis-benchmarkを使用してストレステストを実行します。redis-benchmark -h <IP> -p 6379 -n 1000000 -t set -c 100