このトピックでは、共有メモリ通信 (SMC) で発生する可能性のある問題とその解決方法について説明します。このトピックは Alibaba Cloud Linux 3 に適用されます。
SMC が TCP よりもアプリケーションのパフォーマンス向上をもたらさない
問題の説明
アプリケーションの TCP 接続を高速化するために TCP の代わりに SMC を使用した場合、アプリケーションのパフォーマンスは向上しません。
原因と解決策
アプリケーションに対して確立された SMC 接続が TCP にフォールバックします。この場合、リモートダイレクトメモリアクセス (RDMA) を使用してネットワーク通信を高速化することはできません。フォールバックの問題のトラブルシューティングと解決方法については、このトピックのSMC が TCP にフォールバックし、RDMA を使用して通信を高速化できないセクションを参照してください。
アプリケーションのネットワーク通信オーバーヘッドは、全体的なオーバーヘッドのほんの一部を占めています。たとえば、アプリケーションは CPU 集約型であり、ネットワーク通信への依存度はわずかです。
TCP パケットと比較して、RDMA パケットには、RDMA 関連の情報を格納するための追加のヘッダー領域が必要です。利用可能な帯域幅が同じ場合、RDMA パケットの送信で達成できる実際の帯域幅は、TCP パケットの送信で達成できる帯域幅よりもわずかに低くなります。この問題を軽減するには、ジャンボフレーム機能を使用します。この機能の詳細については、「ジャンボフレーム」をご参照ください。
SMC は、アプリケーションのネットワーク通信モデルと互換性がありません。シナリオ例:
短命の接続が頻繁に確立および切断されるシナリオ。SMC 接続の確立には、RDMA リソースの作成や要求などのスローパス操作が含まれます。主に短命の接続を使用するアプリケーションの場合、SMC は TCP よりもパフォーマンスの向上をもたらしません。
リソースが制限されているシナリオ。SMC 通信に必要なリソースは、Elastic Compute Service (ECS) インスタンスのメモリと eRDMA インターフェース (ERI) の仕様によって異なります。リソースが不足している場合、SMC は TCP にフォールバックすることがあります。詳細については、「SMC を有効化および構成する」をご参照ください。
SMC を有効にした後、通信に失敗する
問題の説明
Alibaba Cloud Linux 3 を実行している ECS インスタンスに対して、Remote Direct Memory Access を介した共有メモリ通信 (SMC-R) を有効にした後、特定のインターネット向けサービスのアドレスなど、特定のアドレスを ping することはできますが、アクセスすることはできません。SMC-R を無効にすると、問題は解決します。
原因
一部のサーバーは TCP の仕様に厳密には準拠していません。サーバーが TCP オプションを処理するときに、サーバーは TCP オプションを再生することがあります。その結果、ローカルエンドは、SMC 非対応のピアサーバーが SMC をサポートしていると誤って認識します。
TCP 実装MUST (MUST-6) は、オプションに長さフィールドがあると仮定して、実装していない TCP オプションをエラーなしで無視する必要があります。詳細については、「RFC 9293」をご参照ください。
SMC のサポートを示すために使用される TCP オプションが再生されると、ローカルエンドはピアサーバーを SMC 対応であると誤認します。この場合、ハンドシェイクエラーが発生します。その結果、cURL リクエストなどのリクエストは失敗しますが、インターネット制御メッセージプロトコル (ICMP) を介した ping は成功します。
通信リンクチェックを実行して、問題を診断できます。
解決策
TCP オプションのリプレイ問題は予期せず発生し、中間ネットワークノードまたはピアによって TCP オプションがリプレイされるため、解決できません。 BPF ポリシーに基づく SMC ネゴシエーション制御を実行し、問題のあるリンクでのアクセスに SMC を使用しないことをお勧めします。
smc_run コマンドを実行した後、SMC を有効にできなかった
問題の説明
smc_run ./foo コマンドを実行してアプリケーションの SMC を有効にした後、smcr l コマンドを実行して SMC-R リンクグループを調べますが、コマンド出力は SMC-R リンクグループが作成されていないことを示しています。次に、smcss -a コマンドを実行して SMC ソケットをクエリしますが、コマンド出力は SMC 接続が存在しないか、SMC 接続が片側で TCP にフォールバックしていることを示しています。コマンドの詳細については、「SMC を有効化および構成する」をご参照ください。
原因
smc_run コマンドは、次のメカニズムを使用して SMC を透過的に有効にします。LD_PRELOAD 変数で指定された smc-tools からの動的リンクライブラリを他のライブラリよりも前にプリロードし、プリロードされた動的リンクライブラリで socket(2) 呼び出しを行って、ソケットのファミリとプロトコルを変更します。アプリケーションが動的にリンクされていない場合、smc_run コマンドを実行してアプリケーションの SMC を透過的に有効にすることはできません。
解決策
sysctl net.smc.tcp2smc コマンドを実行して SMC を有効にします。詳細については、「SMC を有効化および構成する」をご参照ください。
SMC を有効にした後、特定のポートが使用できなくなる
問題の説明
SMC がロードされると、65500 ~ 65515 のポート範囲内の 16 個のポートが使用できなくなります。ポートに対して bind(2) 呼び出しを行うと、EADDRINUSE が返されます。
原因
SMC-R と eRDMA が一緒に使用されています。SMC モジュールは、ERI が存在するネット名前空間のポート 65500 ~ 65515 を使用して、アウトオブバンド (OOB) 接続を確立します。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 pnetidSMC モジュールがポートを占有できなかった場合、SMC モジュールは eRDMA デバイスを使用できません。
解決策
SMC モジュールをアンロードして、ポートを解放します。SMC モジュールのアンロード方法については、「SMC の使用」トピックのAlibaba Cloud ECS で SMC を使用するセクションを参照してください。
IPv6 アドレスを使用すると、SMC が TCP にフォールバックする
問題の説明
IPv6 アドレスを使用するアプリケーションに対して SMC を有効にした後、smcss コマンド出力は、原因コード 0x03030000 または 0x0x09990000 で SMC が TCP にフォールバックしたことを示しています。
原因
Alibaba Cloud eRDMA デバイスと SMC は IPv6 アドレスをサポートしていないため、SMC は TCP にフォールバックします。
解決策
新しい接続に対して SMC を有効にする前に、次のいずれかの方法を使用します。
方法 1: IPv6 アドレスを無効にする。
次のコマンドを実行して、すべてのネットワークインターフェースの IPv6 アドレスを無効にします。
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1 sysctl -w net.ipv6.conf.default.disable_ipv6=1次のコマンドを実行して、特定のネットワークインターフェースの IPv6 アドレスを無効にします。
<NetInName>をネットワークインターフェースの名前に置き換えます。sudo sysctl -w net.ipv6.conf.<NetInName>.disable_ipv6=1
方法 2: カーネルバージョン
5.10.134-17.3以降でIPv4 マップ IPv6アドレスを使用する。
極端な PPS 条件下では、SMC のパフォーマンスが TCP のパフォーマンスよりも低い
問題の説明
ネットワーク負荷が ECS インスタンスタイプで定義されている最大 1 秒あたりのパケット数 (PPS) レートに達すると、eRDMA で SMC を使用するアプリケーションは、TCP を使用するアプリケーションよりもクエリ/秒 (QPS) パフォーマンスが低くなります。
TCP トラフィック:
sar -n DEV 1コマンドを実行して、ネットワークインターフェースで 1 秒あたりに送信されるパケット数 (rxpck/sおよびtxpck/s) を確認し、ネットワーク負荷が PPS 制限に達しているかどうかを確認します。SMC eRDMA トラフィック:
eadm stat -d <ibdev_name> -lコマンドを実行して、eRDMA ネットワークインターフェースで 1 秒あたりに送信されるパケット数を確認し、ネットワーク負荷が PPS 制限に達しているかどうかを確認します。eadmの詳細については、「eadm を使用して eRDMA の問題を診断およびトラブルシューティングする」をご参照ください。
原因
RDMA は、同じ数のネットワークリクエストに対して TCP よりも多くのネットワークパケットを生成します。その結果、ECS インスタンスの PPS 制限に早く達し、アプリケーションの QPS パフォーマンスが向上しなくなります。
解決策
この問題は、ベンチマークストレステスト中など、PPS 制限に達する極端なネットワーク負荷条件下でのみ発生します。実際のシナリオでは、ネットワークトラフィック負荷が PPS 制限に達することはめったにありません。これが発生した場合は、SMC を使用しないことをお勧めします。
SMC が TCP にフォールバックし、RDMA を使用して通信を高速化できない
問題の説明
アプリケーションで TCP を置き換えるために SMC を有効にした後、smcss -a コマンドを実行すると、コマンド出力は SMC 接続が自動的に TCP にフォールバックしたことを示しています。
原因
SMC 接続の確立中に例外が発生して SMC 接続が TCP にフォールバックした場合でも、SMC 接続を通信に使用することはできますが、SMC 接続を使用するアプリケーションは RDMA のパフォーマンス上の利点を利用できません。SMC から TCP へのフォールバックが発生すると、原因コードが返されます。コードに基づいてフォールバックの原因を特定できます。
解決策
smcss -aコマンドを実行して、SMC から TCP へのフォールバックの原因コードを取得します。コマンド出力の例:
State UID Inode Local Address Peer Address Intf Mode ACTIVE 00000 0156721 192.168.99.21:60188 192.168.99.22:8090 0000 TCP 0x03010000 ACTIVE 00000 1202539 172.16.4.189:44780 172.16.4.190:1811 0000 SMCR最初のエントリでは、[Intf Mode] 列の TCP は、SMC 接続が TCP にフォールバックしたことを示しています。原因コードは 0x03010000 です。2 番目のエントリでは、[Intf Mode] 列の SMCR は、SMC-R 接続が確立されていることを示しています。2 つの原因コード (例: 0x05000000 と 0x03030001) が [Intf Mode] 列に表示されている場合、最初のコードはローカルホストの原因を示し、2 番目のコードはピアホストの原因を示します。ほとんどの場合、SMC から TCP へのフォールバックはピアホストによって発生します。
原因コードに基づいて SMC から TCP へのフォールバックの原因を特定し、フォールバックを解決します。
SMC を有効にした後、一般的なネットワーク O&M ツールで収集されたデータが期待どおりにならない
問題の説明
Alibaba Cloud Linux 3 を実行している ECS インスタンスで SMC を有効にした後、tcpdump や Wireshark などの一般的なネットワーク分析ツール、および Socket Statistics(ss)や netstat ユーティリティなどのネットワーク監視ツールで収集されるネットワークトラフィックデータが期待どおりにならないか、期待されるトラフィックデータを収集できません。
原因
SMC-R は、RDMA に基づく通信プロトコルです。現在、一般的なネットワーク O&M ツールは TCP トラフィックのみを分析または監視し、RDMA パケットを識別できません。その結果、ネットワーク O&M ツールに表示されるデータは、実際のネットワークデータと一致しません。
解決策
RDMA 関連の O&M ツールを使用して、データを分析または監視します。詳細については、「eRDMA の監視と確認」をご参照ください。
GPU アクセラレーションインスタンスまたはスーパーコンピューティングクラスタ (SCC) インスタンスにロードされている SMC モジュールが使用できません
問題の説明
GPU アクセラレーションインスタンスまたは SCC インスタンスにロードされている SMC モジュールが使用できません。
原因
Mellanox OpenFabrics Enterprise Distribution (OFED) ドライバーは、GPU アクセラレーションインスタンスおよび SCC インスタンスにインストールされています。OFED スタックの SMC モジュールは自動的にロードされ、動作しません。Mellanox OFED ドライバーをインストールすると、RDMA 関連関数のシンボルが変更されます。カーネルに含まれる SMC モジュールはロードに失敗し、Unknow symbol エラーが表示されます。
解決策
Alibaba Cloud Linux 3 の SMC モジュールは、GPU アクセラレーションインスタンスまたは SCC インスタンスでは使用できません。
SMC を有効にした後、setsockopt および getsockopt 呼び出しの一部の SOL_SOCKET または SOL_TCP レベルのオプションが期待どおりに動作しません
問題の説明
アプリケーションで TCP を置き換えるために SMC を有効にした後、TCP 接続に使用されていた一部の SOL_SOCKET または SOL_TCP レベルのオプションを、setsockopt または getsockopt 呼び出しを行うことで構成できなかったり、構成後に期待どおりに動作しなかったりします。
原因
TCP プロトコルスタックを SMC プロトコルスタックに置き換えると、共有バッファーを使用して SMC リンク経由でデータが転送されます。 SMC のプロトコルスタック設計とデータ転送方法は、TCP のプロトコルスタック設計とデータ転送方法とは大きく異なります。 この場合、SOL_SOCKET または SOL_TCP レベルのオプションは適用できません。
解決策
Alibaba Cloud Linux 3 で SMC によってサポートされている SOL_SOCKET または SOL_TCP レベルのオプション、およびサポートされていないオプションに注意してください。 次の表は、SOL_SOCKET または SOL_TCP レベルのオプションに対する SMC のサポートについて説明しています。
表には、Y、M、および N が表示されます。
Y: オプションは SMC でサポートされており、構成および取得が可能で、期待どおりに動作します。
M: オプションは SMC でサポートされておらず、構成および取得は可能ですが、SMC と TCP の設計の違いにより、期待どおりに動作しません。
N: オプションは SMC でサポートされておらず、構成または取得できません。 原因コード 0x03060000 または 0x03010001 で TCP へのフォールバックが発生します。