Alibaba Cloud Linux 3は、カーネル空間で機能する高性能ネットワークプロトコルであるSMC (Shared Memory Communication) を提供しています。 SMCは共有メモリ技術を利用し、ソケットインターフェイスと連携してネットワーク通信を確立します。 SMCは、共有メモリ技術に基づいて、共有メモリ通信 − ダイレクトメモリアクセス (SMC-D) およびリモートダイレクトメモリアクセスを介した共有メモリ通信 (SMC-R) に分類される。 SMC-Dは、内部共有メモリ (ISM) 技術を使用し、SMC-R、リモートダイレクトメモリアクセス (RDMA) 技術を使用する。 このトピックでは、SMC-Rとその使用方法について説明します。
背景情報
2017年、IBMはLinux用のオープンソースSMC-Rを4.11し、これまで維持してきました。 SMC-Rの詳細については、「RFC 7609」をご参照ください。 Alibaba Cloud Linux 3は、Alibaba Cloud Elastic RDMA (eRDMA) を活用してクラウドにSMC-Rを実装します。 SMC-Rは、機能を失うことなくアプリケーションのTCPを透過的に置き換えることができ、すべてのユーザーがアクセスできる高性能のハードウェアソフトウェア共同設計ネットワークを提供します。
SMC-Rの共有メモリベースのデータ交換モデルは、RDMAによって提供されるアトミックメモリ操作に依存しています。 RDMAは、ネットワークノードがカーネルをバイパスしてリモートメモリに直接アクセスできるように、RDMAネットワークインターフェイスカード (RNIC) にプロトコルスタックを実装します。 従来のTCPネットワークと比較して、RDMAネットワークは、メモリ間のコピーを削減し、データ転送で消費するCPUリソースを削減して、低レイテンシ、高スループットの通信を提供します。 次の図は、TCP/IPスタックとRDMAスタックの違いを示しています。
RDMAは、データ集約型および計算集約型のシナリオで広く使用されており、高性能コンピューティング、機械学習、データセンター、大容量ストレージなどの複数の分野に適しています。
以前は、RDMAは特定のデータセンターのネットワークカードとスイッチと一緒にしか使用できませんでした。 その結果、RDMAの展開は複雑でした。 Alibaba Cloud eRDMAは、RDMAをクラウドにもたらします。 これにより、すべてのECS (Elastic Compute Service) ユーザーは、ネットワークカードやスイッチなどの基盤となる物理ネットワーク環境に対して複雑な設定を行う必要なく、RDMAを使用してデータを送信できます。
RDMAはInfiniBand (IB) 動詞インターフェイスに依存しており、従来のPortable Operating System Interface (POSIX) ソケットインターフェイスとは大きく異なります。 既存のソケットアプリケーションは、RDMAネットワークに移行する前に大幅に変換する必要があります。 RDMAを適用するには、高度な技術的専門知識が必要です。
eRDMAを活用し、より高いネットワークパフォーマンスを提供するために、Alibaba Cloud Linux 3は最適化されたSMC-Rを提供します。 最適化されたSMC-Rは、効率的な方法でRDMAを利用し、標準TCPアプリケーションと互換性があります。 これにより、変更なしでより多くのアプリケーションのパフォーマンスが向上します。
メリット
SMC-Rには以下の利点があります。
高性能
RDMAは、カーネルからネットワークカードにプロトコルスタックをオフロードします。 これにより、特定のシナリオでは、従来のTCPスタックよりも低いネットワーク遅延、高いスループット、および低いCPU使用率をSMC-Rに提供します。
ハードウェアのオフロード
リモートメモリへの信頼性と効率的な直接アクセス
透明な交換
SMC-RはPOSIXソケットインターフェイスと互換性があり、ソケットアプリケーションが変更やさらなる開発なしにTCPスタックからSMC-Rスタックに切り替えることを可能にする透過的な交換機能を提供します。
SMC-Rはソケットインターフェイスを呼び出して共有メモリ通信を提供できます。
SMC-Rにより、機能を失うことなく、プロトコルスタックのマルチレベルのトランスペアレントな置換が可能になります。
SMC-Rにより、自動ネゴシエーションと安全なフォールバックメカニズムが提供されます。
アーキテクチャ
SMC-Rアーキテクチャ:
プロトコル階層と透過的な置換
SMC-Rはカーネル空間で機能し、ユーザーモードプログラムがソケットインターフェイスを使用して記述するネットワーク動作をサポートします。 SMC-Rは、IB動詞インターフェイスを使用してRDMA送信も実行します。 SMC-Rスタックは、RDMAリソースを使用、管理、および維持します。 アプリケーションは、カーネル内のRDMAエンティティの影響を受けません。 次の図は、SMC-Rのアーキテクチャを示しています。
Alibaba Cloud Linux 3は、プロセスレベルまたはネット名前空間レベルでTCPスタックをSMC-Rスタックに透過的に置き換えるために使用できるメカニズムを提供します。 このメカニズムは、LD_PRELOADまたはsysctl net.smc.tcp2smcを使用して、アプリケーションでAF_INETソケットをAF_SMCソケットに透過的に置き換えます。 このタイプの置換は、SMC-Rスタックを介したデータ伝送を可能にし、アプリケーションを変更する必要なしにRDMAに基づくネットワーク性能を改善します。
自動ネゴシエーションと安全なフォールバック
SMC-Rは自動ネゴシエーション機能を提供し、TCPに動的にフォールバックできます。 SMC-R通信を確立するために、SMC-Rスタックは、カーネルにおいてピアノードへのTCP接続を確立します。 ハンドシェイクプロセス中、ローカルノードは特定のTCPオプションを使用してSMC-Rをサポートし、ピアノードもSMC-Rをサポートしていることを検証します。
ネゴシエーションが成功した場合、ローカルおよびピアノード上のSMC-Rスタックは、新しいRDMAリソースを作成するか、または既存のRDMAリソースを再利用して、使用可能なRDMA高信頼接続 (RC) を確立します。 データは、RDMAリンクに沿ってノード間で送信されます。
ローカルノードまたはピアノードにRDMAデバイスがないなどの特定の理由でネゴシエーションが失敗した場合、SMC-Rスタックは自動的にTCPスタックにフォールバックします。 ローカルおよびピアノードは、データを送信するためにネゴシエーション中に確立されるTCP接続を使用します。
説明SMC-Rは、接続ネゴシエーション中のみTCPスタックへのフォールバックをサポートし、データ送信中はサポートしません。
次の図は、接続ネゴシエーションとデータ送信のデータフローを示しています。
RDMAに基づく共有メモリ通信
ネゴシエーションが完了し、接続が確立された後、各SMC-Rスタックは、SMC-Rソケットに、送信されるデータをキャッシュするために使用されるリング状の送信バッファ (sndbuf) と、受信されるデータをキャッシュするために使用されるリング状のリモートメモリバッファ (RMB) とをローカルに割り当てます。
送信ノード上のアプリケーションがデータを送信しようとすると、アプリケーションはソケットインターフェイスを使用してデータをローカルsndbufにコピーします。 次に、送信ノード上のSMC-Rスタックは、RDMA書き込み動作を実行して受信ノードのRMBにデータを書き込み、RDMA送信またはRDMA受信動作を実行して、接続データ制御 (CDC) メッセージを送信または受信して、リング状バッファ内のカーソルを更新および同期させます。
受信ノード上のSMC-Rスタックが、データがRMBに書き込まれたことを検出すると、SMC-Rスタックは、epollなどの異なる方法を使用して、受信ノード上のアプリケーションに、RMBからユーザモードバッファにデータをコピーするように通知します。 データがユーザモードバッファにコピーされると、データ送信は完了します。 SMC-Rにおいて、RMBは、データ送信中に共有メモリとして使用されます。
データ送信の手順を次の図に示します。
シナリオ
SMC-Rは、次のシナリオに適しています。
レイテンシに敏感なデータのクエリと処理
SMC-Rは、Redis、Memcached、PostgreSQLなど、高パフォーマンスのデータクエリとデータ処理を含み、高いネットワークパフォーマンスを必要とするシナリオに適しています。 SMC-Rは、アプリケーションのTCPを透過的かつ非侵襲的な方法で置き換えることができ、アプリケーションは、さらなる開発または適応なしに、1秒あたりのクエリ (QPS) を50% 増加させることができます。
高スループットデータ伝送
クラスタ内で大規模にデータを交換または送信すると、大量の帯域幅とCPUリソースが消費されます。 RDMAにより、SMC-Rは従来のTCPスタックよりも低いCPU負荷で同じスループットを提供できます。 これにより、コンピューティングリソースが節約されます。
SMC-Rのハンドシェーク処理中に、RDMAリソースが要求され、作成される。 したがって、SMC-Rは、接続が頻繁に確立され、閉じられる短期間の接続シナリオには適していません。
SMC-RがECSインスタンスでサポートしている接続数には、次の要因があります。
インスタンスの使用可能な連続物理メモリ。 既定では、各SMC-Rソケットで使用されるsndbufとRMBは、SMC-R接続の確立時に割り当てられる連続した物理メモリを使用します。 sndbufのデフォルトサイズはnet.smc.wmem値で、RMBのデフォルトサイズはnet.smc.rmem値です。 次のコマンドを実行して、デフォルトのサイズを表示できます。
sysctl net.smc.wmem # The default size of the sndbuf used by each SMC-R socket. Unit: bytes. sysctl net.smc.rmem # The default size of the RMB used by each SMC-R socket. Unit: bytes.
Elastic RDMAインターフェイス (ERI) eRDMA仕様。 SMC-Rが接続用に作成するRDMAリソースの最大数。 リソースには、キューペア (QP) 、メモリ登録 (MR) 、完了キュー (CQI) 、および保護ドメイン (PD) が含まれます。 最大数は、インスタンスのERI eRDMA仕様によって異なります。
SMC-Rが必要なリソースを取得できない場合、SMC-Rは安定した信頼できるデータ伝送を保証するためにTCPに安全にフォールバックします。
SMC-Rを使用
Alibaba Cloud Linux 3は、カーネルで最適化されたSMC-Rスタックを提供します。 SMC-Rスタックは、包括的なSMC-R監視および診断ツールによって支えられています。 SMC-Rを使用するには、次の手順を実行します。
ERIをサポートするECSインスタンスを作成します。
SMC-RはRDMAに依存する。 SMC-Rを使用する前に、ERI機能をサポートするECSインスタンスを作成して、クラウドでRDMAを有効にする必要があります。 詳細については、「エンタープライズレベルのインスタンスでのeRDMAの設定」をご参照ください。
重要Alibaba Cloud ERI eRDMAデバイスとSMCはIPv6アドレスをサポートしていません。 アプリケーションがIPv6を使用する場合、SMCはTCPにフォールバックします。
次のコマンドを実行して、
smc
およびsmc_diag
カーネルモジュールをロードします。modprobe smc modprobe smc_diag
dmesg
コマンドを実行して、カーネル関連のメッセージを表示できます。 カーネルモジュールが読み込まれると、次の情報が表示されます。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
があります
説明カーネルバージョン5.10.134-015以降では、SMC-RとeRDMAを組み合わせて使用するため、SMCモジュールのロード時に、ネット名前空間内のポート65500から65515までの16個のソケットポートを使用して、ERIにアクセスできます。 ポートを使用できない場合、SMCモジュールはロードできますが、ERI eRDMAデバイスは使用できません。 SMCモジュールがアンロードされると、使用済みのソケットポートが解放されます。
次のコマンドを実行して、カーネルのバージョンを表示できます。
uname -r
SMCモジュールのロード時にポートが使用できないため、ERI eRDMAデバイスが使用できない場合に表示される情報:
smc: smc: load SMC module with reserve_mode NET: Registered protocol family 43 warning: smc: netns <netns ID> reserved ports <Numbers of the ports that cannot be used> FAIL for eRDMA OOB
のFAIL
次のコマンドを実行して、SMCモジュールをアンロードできます。
rmmod smc_diag rmmod smc
SMCモジュールのアンロード時に表示される情報:
NET: Unregistered protocol family 43 smc: removing ib device erdma_0 smc: netns <netns ID> released ports [65500 ~ 65515] used by eRDMA OOB
によって使用されるリリースされたポート [65500〜65515]
次のコマンドを実行してsmc-tools toolkitをインストールします。
yum install -y smc-tools
(オプション) デフォルトのsndbufおよびRMBサイズを指定します。
各SMC-Rスタックは、SMC-Rソケットに、送信されるデータをキャッシュするために使用されるリング状sndbufと、受信されるデータをキャッシュするために使用されるリング状RMBとをローカルに割り当てます。 詳細については、このトピックの「アーキテクチャ」セクションをご参照ください。 TCPの送信バッファと受信バッファと比較して、SMC-RのsndbufsとRMBのサイズは16 KBから512 KBです。
SMC-Rに基づいてネットワークアクセラレーションを最大化するには、次の方法を使用して、スループット集約型ネットワークモデルのSMC-RソケットのデフォルトのsndbufおよびRMBサイズを変更します。
Alibaba Cloud Linux 3は、sysctl net.smc.wmemおよびsysctl net.smc.rmemコマンドを提供して、現在のnet名前空間の後続のSMC-RソケットのデフォルトのsndbufおよびRMBサイズを設定します。 既存のSMC-RソケットのデフォルトのsndbufおよびRMBサイズは影響を受けません。
sysctl net.smc.wmem=<sndbuf size, in bytes> sysctl net.smc.rmem=<RMB size, in bytes>
sysctl net.smc.wmem
およびsysctl net.smc.rmem
の初期値は256 KBです。アプリケーションは、setsockopt() 呼び出しを使用して、SMC-Rソケットで使用されるsndbufおよびRMBのサイズを変更することによって、SO_SNDBUFおよびSO_RCVBUFオプションを設定することもできます。
SMCスタック上でTCPソケットアプリケーションを実行します。
Alibaba Cloud Linux 3では、SMCは、ネット名前空間レベルまたはプロセスレベルでTCPを透過的に置き換えることができます。
ネット名前空間レベルの透過的な置き換え
Alibaba Cloud Linux 3は、ネット名前空間レベルの透過的置換機能を提供します。 この機能を使用すると、
sysctl net.smc.tcp2smc
コマンドを実行して、TCPソケットをnet名前空間のSMCソケットに置き換えることができます。 TCPソケットは次の条件を満たす必要があります。ファミリ値はAF_INETです。
タイプ値はSOCK_STREAMです。
プロトコル値はIPPROTO_IPまたはIPPROTO_TCPです。
次の図は、交換手順を示しています。
ネット名前空間の透過置換を設定するには、次の手順を実行します。
次のコマンドを実行して、ネット名前空間の透過的な置換を有効にします。
sysctl net.smc.tcp2smc=1
デフォルトでは、
sysctl net.smc.tcp2smc
は0に設定されています。次のコマンドを実行して、net名前空間でTCPソケットアプリケーションを実行します。
. /foo
fooアプリケーションによって作成されたTCPソケットは、透過的にSMCソケットに置き換えられます。 アプリケーションのネットワーク動作は、SMC-Rスタックによって処理される。 ローカルノードおよびピアノードがSMC-Rをサポートし、ネゴシエーションが成功した場合、ノードはRDMAに基づいて互いにデータを送信する。 ローカルまたはピアノードがSMC-Rをサポートしない場合、またはネゴシエーションが失敗した場合、ノードはデータ送信のためにTCPに安全にフォールバックします。 詳細については、このトピックの「アーキテクチャ」セクションをご参照ください。
次のコマンドを実行して、ネット名前空間の透過置換を無効にします。
sysctl net.smc.tcp2smc=0
プロセスレベルの透明な取り替え
Alibaba Cloud Linux 3は、アプリケーションのTCPをSMC-Rに置き換えるためのプロセスレベルの透過的な置換機能を提供します。 この機能には、SMC-R監視および診断ツールキットsmcツールが必要です。 smc-toolsのインストール方法については、手順3をご参照ください。 smc-toolsをインストールします。
次の図は、交換手順を示しています。
smc_run
スクリプトをsmc-toolsから実行してアプリケーションを実行する場合、smc_run
スクリプトはLD_PRELOAD
環境変数を使用して、smc-toolsのlibsmc-PRELOAD. soを最初にロードする必要がある動的ライブラリとして設定します。libsmc-preload.soは、アプリケーションとアプリケーションの子プロセスのTCPソケットをSMCソケットに置き換えます。 TCPソケットは次の条件を満たす必要があります。
ファミリ値はAF_INETです。
タイプ値はSOCK_STREAMです。
プロトコル値はIPPROTO_IPまたはIPPROTO_TCPです。
次のコマンドを実行して、SMC-Rスタックに対してfooを実行します。
smc_run ./foo
fooアプリケーションによって作成されたTCPソケットは、透過的にSMCソケットに置き換えられます。 アプリケーションのネットワーク動作は、SMC-Rスタックによって処理される。 ローカルノードおよびピアノードがSMC-Rをサポートし、ネゴシエーションが成功した場合、ノードはRDMAに基づいて互いにデータを送信する。 ローカルまたはピアノードがSMC-Rをサポートしない場合、またはネゴシエーションが失敗した場合、ノードはデータ送信のためにTCPに安全にフォールバックします。 詳細については、このトピックの「アーキテクチャ」セクションをご参照ください。
モニタリングと診断
SMCを使用する場合、smc-toolsツールキットを使用して、カーネル内のSMCスタックを監視および診断できます。 これにより、SMCネットワークトラフィックのさまざまなメトリックを理解し、ネットワークの正常性を判断できます。 詳細については、「SMCの監視と確認」をご参照ください。
関連ドキュメント
通信障害や特定のポートの使用不能などのSMCの問題を解決する方法については、「SMCのトラブルシューティング」をご参照ください。