このトピックでは、共有メモリ通信 (SMC) で発生する可能性のある問題とその解決方法について説明します。 このトピックは、Alibaba Cloud Linux 3に適用されます。
SMCはTCPを超えるアプリケーションパフォーマンスの改善を提供しません
問題の説明
TCPの代わりにSMCを使用してアプリケーションのTCP接続を高速化しても、アプリケーションのパフォーマンスは向上しません。
原因と解決策
アプリケーションに対して確立されたSMC接続はTCPにフォールバックします。 この場合、リモートダイレクトメモリアクセス (RDMA) を使用してネットワーク通信を高速化することはできません。 フォールバックの問題のトラブルシューティングと解決方法については、このトピックの「SMC fall back to TCP and RDMA cannot be used to accelerate communications」をご参照ください。
アプリケーションのネットワーク通信オーバーヘッドは、オーバーヘッド全体のごく一部を占める。 たとえば、アプリケーションはCPU集約型であり、ネットワーク通信にわずかに依存します。
SMCは、アプリケーションのネットワーク通信モデルと互換性がありません。 シナリオ例:
SMCを有効にすると通信が失敗する
問題の説明
Alibaba Cloud Linux 3を実行するECSインスタンスの共有メモリ通信SMC-R (Remote Direct Memory Access) を有効にすると、特定のインターネット接続サービスのアドレスなどの特定のアドレスにpingを送信できますが、アクセスできません。 SMC-Rを無効にすると、問題は解決されます。
原因
一部のサーバーは、TCP仕様に厳密に準拠していません。 サーバがTCPオプションを処理するとき、サーバはTCPオプションを再生することができる。 その結果、ローカルエンドは、SMC能力のないピアサーバがSMCをサポートしていると誤ってみなす。
TCP実装MUST (MUST-6) は、オプションが長さフィールドを持つと仮定して、実装していないTCPオプションをエラーなく無視します。 詳細については、「RFC 9293」をご参照ください。
SMCのサポートを示すために使用されるTCPオプションが再生されると、ローカルエンドはピアサーバーをSMC対応であると誤認します。 この場合、ハンドシェイクエラーが発生します。 その結果、cURL要求などの要求は失敗しますが、インターネット制御メッセージプロトコル (ICMP) を介したpingは成功します。
check_tcpoption_replay.pyツールを使用して問題を診断できます。
Python 3およびScapyライブラリをインストールします。
yum install python3 -y python3 -m pip install scapy
check_tcpoption_replay.pyツールを実行します。
python3 check_tcpoption_replay.py -i <Server IP address> -p <Server port>
特定のサーバーでTCPオプションの再生の問題が発生した場合、コマンド出力に
サーバーがTCPオプションを再生しました
が表示されます。 特定のサーバーでTCPオプションの再生の問題が発生しなかった場合、コマンド出力に[サーバーはTCPオプションを再生しませんでした]
が表示されます。
解決策
TCPオプションのリプレイの問題は予期せず発生し、TCPオプションは中間ネットワークノードまたはピアによってリプレイされるため、解決できません。 上記の「問題の説明」セクションで説明されている問題のあるサービスにアクセスする場合は、SMCを使用しないことを推奨します。
smc_runコマンドの実行後にSMCの有効化に失敗しました
問題の説明
を実行した後、smc_run ./foo
コマンドを実行してアプリケーションのSMCを有効にすると、smcr l
コマンドを実行してSMC-Rのリンクグループを探索しますが、コマンド出力はSMC-Rのリンクグループが作成されていないことを示します。 次に、smcss -a
コマンドを実行してSMCソケットを照会しますが、コマンド出力は、SMC接続が存在しないこと、またはSMC接続が片側でTCPにフォールバックすることを示します。 コマンドの詳細については、「」をご参照ください。
原因
smc_run
コマンドは、次のメカニズムを使用してSMCを透過的に有効にします。LD_PRELOAD変数で指定されたsmc-toolsから他のライブラリの前にダイナミックリンクライブラリをプリロードし、プリロードされたダイナミックリンクライブラリでソケット (2) 呼び出しを行い、ソケットのファミリとプロトコルを変更します。 アプリケーションが動的にリンクされていない場合、smc_run
コマンドを実行して、アプリケーションのSMCを透過的に有効にすることはできません。
解決策
「smcの使用」で説明されているsysctl net. SMC. tcp2smc
コマンドを実行してSMCを有効にします。
SMCを有効にすると、特定のポートが使用できなくなります
問題の説明
SMCがロードされると、65500〜65515のポート範囲内の16個のポートが使用できなくなります。 ポートのバインド (2) 呼び出しを行うと、EADDRINUSE
が返されます。
原因
SMC-RとeRDMAは一緒に使用されます。 SMCモジュールは、帯域外 (OOB) 接続を確立するために、ERIが存在するネット名前空間内のポート65500 65515を使用する。 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
があります
SMCモジュールがポートを占有できない場合、SMCモジュールはeRDMAデバイスを使用できません。
解決策
SMCモジュールをアンロードしてポートを解放します。 SMCモジュールをアンロードする方法については、「SMCの使用」トピックの手順セクションを参照してください。
SMCはTCPにフォールバックし、RDMAを使用して通信を加速することはできません
問題の説明
アプリケーションでSMCがTCPを置き換えることを有効にした後、smcss -a
コマンドを実行すると、コマンドの出力は、SMC接続が自動的にTCPにフォールバックすることを示します。
原因
SMC接続の確立中に例外によってSMC接続がTCPにフォールバックする場合でも、SMC接続は通信に使用できますが、SMC接続を使用するアプリケーションはRDMAのパフォーマンス上の利点を活用できません。 SMCからTCPへのフォールバックが発生すると、原因コードが返されます。 コードに基づいてフォールバックの原因を特定できます。
解決策
smcss -a
コマンドを実行して、SMC-to-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モード列のTCPは、SMC接続がTCPに戻ったことを示します。 原因コードは0x03010000です。 2番目のエントリでは、Intfモード列のSMCRは、SMC-R接続が確立されていることを示します。 Intfモード列に2つの原因コード (例: 0x05000000と0x03030001) が表示されている場合、最初のコードはローカルホストの原因を示し、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モジュールの読み込みに失敗し、不明シンボル
エラーが表示されます。
解決策
Alibaba Cloud Linux 3のSMCモジュールは、GPUアクセラレーションまたはSCCインスタンスでは使用できません。
SMCを有効にすると、setsockoptおよびgetsockopt呼び出しの一部のSOL_SOCKETまたはSOL_TCPレベルオプションが期待どおりに機能しなくなります。
問題の説明
SMCを有効にしてアプリケーションでTCPを置き換えた後、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へのフォールバックが発生します。