Alibaba Cloud Linux 3 は、カーネル空間で機能する高性能ネットワークプロトコルである 共有メモリ通信 (SMC) を提供します。 SMC は、リモートダイレクトメモリアクセス (RDMA) テクノロジーを利用し、ソケットインターフェイスと連携してネットワーク通信を確立します。 SMC は、伝送制御プロトコル (TCP) アプリケーションのネットワーク通信パフォーマンスを透過的に最適化できます。 ただし、ネイティブの Elastic Compute Service (ECS) 環境で SMC を使用してネットワーク通信のパフォーマンスを最適化する場合は、SMC が予期せず TCP にダウングレードされないように、関連するポッドのネットワーク名前空間で SMC ホワイトリストと構成を慎重に維持する必要があります。 サービスメッシュ (ASM) は、制御可能なネットワーク環境 (つまり、クラスター) で SMC 最適化機能を提供し、ASM インスタンス内のポッド間のネットワーク通信を自動的に最適化します。 特定の SMC 構成を気にする必要はありません。
前提条件
制限事項
ノードは、elastic Remote Direct Memory Access (eRDMA) をサポートする ECS インスタンスを使用する必要があります。 詳細については、「エンタープライズレベルインスタンスで eRDMA を構成する」をご参照ください。
ノードは Alibaba Cloud Linux 3 を使用する必要があります。 詳細については、「Alibaba Cloud Linux 3」をご参照ください。
ASM インスタンスのバージョンが V1.23 以降であること。 ASM インスタンスの更新方法の詳細については、「ASM インスタンスを更新する」をご参照ください。
Container Service for Kubernetes (ACK) クラスターが Terway ネットワークプラグインを使用していること。 詳細については、「Terway を使用する」をご参照ください。
ACK クラスターの API サーバーへのインターネットアクセスが有効になっていること。 詳細については、「クラスターの API サーバーへのパブリックアクセスを制御する」をご参照ください。
手順
手順 1:関連ノードを初期化する
SMC は、elastic RDMA インターフェイス (ERI) を使用してネットワーク通信を高速化します。 SMC を有効にする前に、関連ノードを初期化する必要があります。
Alibaba Cloud Linux 3 のカーネルバージョンを 5.10.134-17.3 以降にアップグレードします。 詳細については、「カーネルバージョンを変更する」をご参照ください。
ノードに erdma-controller をインストールし、Shared Memory Communication over RDMA (SMC-R) を有効にします。 詳細については、「eRDMA を使用してコンテナーネットワーキングを高速化する」をご参照ください。
手順 2:テストアプリケーションをデプロイする
以下のテストで使用されるデフォルトの名前空間に対して、自動サイドカープロキシインジェクションを有効にします。 詳細については、「自動サイドカープロキシインジェクションを有効にする」をご参照ください。
以下の内容を含む fortioserver.yaml ファイルを作成します。
kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスターに接続し、次のコマンドを実行してテストアプリケーションをデプロイします。
kubectl apply -f fortioserver.yaml次のコマンドを実行して、テストアプリケーションのステータスを表示します。
kubectl get pods | grep fortio予期される出力:
NAME READY STATUS RESTARTS fortioclient-8569b98544-9qqbj 3/3 Running 0 fortioserver-7cd5c46c49-mwbtq 3/3 Running 0出力は、両方のテストアプリケーションが想定どおりに起動したことを示しています。
手順 3:ベースライン環境でテストを実行し、ベースラインテスト結果を表示する
fortio アプリケーションが起動した後、リスニングポート 8080 が公開されます。 このポートにアクセスして、fortio アプリケーションのコンソールページを開くことができます。 テストトラフィックを生成するには、fortioclient アプリケーションのポートをローカルポートにマップします。 次に、オンプレミスホストで fortio アプリケーションのコンソールページを開きます。
kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスターに接続し、次のコマンドを実行して fortioclient アプリケーションのポート 8080 をローカルポート 8080 にマップします。
kubectl port-forward service/fortioclient 8080:8080ブラウザのアドレスバーに
http://localhost:8080/fortioと入力して fortioclient アプリケーションのコンソールにアクセスし、関連する構成を変更します。
前の図に示されているページのパラメーター設定を、次の表に従って変更します。
パラメーター
例
[URL]
http://fortioserver:8080/echo
[QPS]
100000
[期間]
30s
[スレッド/同時接続数]
64
[ペイロード]
次の文字列 (128 バイト) を入力します。
xhsyL4ELNoUUbC3WEyvaz0qoHcNYUh0j2YHJTpltJueyXlSgf7xkGqc5RcSJBtqUENNjVHNnGXmoMyILWsrZL1O2uordH6nLE7fY6h5TfTJCZtff3Wib8YgzASha8T8g
構成が完了したら、ページの下部にある [開始] をクリックしてテストを開始します。 プログレスバーが最後まで到達すると、テストは終了します。

テストが終了すると、テスト結果がページに表示されます。 次の図は参考用です。 テスト結果はテスト環境によって異なります。

テスト結果ページでは、x 軸はリクエストのレイテンシを示しています。 ヒストグラムの x 軸のデータ分布を観察することで、リクエストのレイテンシの分布を取得できます。 紫色の曲線は、さまざまな応答時間内に処理されたリクエストの数を示しています。 y 軸は、処理されたリクエストの数を示しています。 ヒストグラムの上部には、リクエストの P50、P75、P90、P99、および P99.9 レイテンシが示されています。 ベースライン環境のテストデータを取得したら、アプリケーションに対して SMC を有効にして、SMC が有効になった後のアプリケーションのパフォーマンスをテストする必要があります。
手順 4:ASM インスタンスとワークロードに対して SMC ベースのネットワーク通信アクセラレーションを有効にする
kubeconfig ファイルの情報に基づいて kubectl を使用して ASM インスタンスに接続します。 次に、次のコマンドを実行して「smcEnabled: true」フィールドを追加し、SMC ベースのネットワーク通信アクセラレーションを有効にします。
$ kubectl edit asmmeshconfig apiVersion: istio.alibabacloud.com/v1beta1 kind: ASMMeshConfig metadata: name: default spec: ambientConfiguration: redirectMode: "" waypoint: {} ztunnel: {} cniConfiguration: enabled: true repair: {} smcEnabled: truekubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスターに接続します。 次に、次のコマンドを実行して fortioserver アプリケーションと fortioclient アプリケーションのデプロイメントを変更し、fortioserver アプリケーションと fortioclient アプリケーションが存在するポッドに smc.asm.alibabacloud.com/enabled: "true" アノテーションを追加します。
ASM インスタンスに対して SMC を有効にした後、ワークロードに対して SMC をさらに有効にする必要があります。 ワークロードに対して SMC を有効にするには、
smc.asm.alibabacloud.com/enabled: "true"アノテーションを関連するポッドに追加します。 クライアント側とサーバー側の両方でワークロードに対して SMC を有効にする必要があります。fortioclient アプリケーションのデプロイメントを変更します。
$ kubectl edit deployment fortioclient apiVersion: apps/v1 kind: Deployment metadata: ...... name: fortioclient spec: ...... template: metadata: ...... annotations: smc.asm.alibabacloud.com/enabled: "true"fortioserver アプリケーションのデプロイメントを変更します。
$ kubectl edit deployment fortioserver apiVersion: apps/v1 kind: Deployment metadata: ...... name: fortioserver spec: ...... template: metadata: ...... annotations: smc.asm.alibabacloud.com/enabled: "true"
手順 5:SMC が有効になっている環境でテストを実行し、テスト結果を表示する
デプロイメントを変更した後、ワークロードが再起動されます。 したがって、手順 3 を参照して、fortioclient アプリケーションのポートをローカルポートに再度マップする必要があります。 次に、テストを再度開始し、テストが完了するまで待ちます。

SMC を有効にしていない場合のテスト結果と比較すると、ASM インスタンスに対して SMC を有効にした後、リクエストのレイテンシが減少し、クエリ/秒 (QPS) が大幅に増加していることがわかります。
FAQ
SMC を有効にした後にデータベースサービスにアクセスできない場合はどうすればよいですか?
この問題は、TCP 仕様に準拠していないロードバランサーを介してデータベースサービスにアクセスするときに、SMC プロトコルの TCP 種別 254 が誤って識別されるために発生します。
次の手順を実行して、この問題を解決できます。
ノードに aliyun-smc-extensions ツールキットをインストールします。
sudo yum install -y aliyun-smc-extensionsaliyunsmc-check を使用して、最終 URL の通信リンクを確認します。
aliyunsmc-check syn_check --url <url>aliyunsmc-check は、最終 URL への TCP オプションの再生、競合、および過度の長さなどの問題を識別できます。 出力例:

サービスの URL にアクセスするときに TCP オプションが正しく処理されない場合は、サービスのポッドにアクセスするときに SMC 最適化を無効にすることをお勧めします。