すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Service Mesh:ASM インスタンスで eRDMA によってポッド間のネットワーク通信を高速化する

最終更新日:Mar 26, 2025

Alibaba Cloud Linux 3 は、カーネル空間で機能する高性能ネットワークプロトコルである 共有メモリ通信 (SMC) を提供します。 SMC は、リモートダイレクトメモリアクセス (RDMA) テクノロジーを利用し、ソケットインターフェイスと連携してネットワーク通信を確立します。 SMC は、伝送制御プロトコル (TCP) アプリケーションのネットワーク通信パフォーマンスを透過的に最適化できます。 ただし、ネイティブの Elastic Compute Service (ECS) 環境で SMC を使用してネットワーク通信のパフォーマンスを最適化する場合は、SMC が予期せず TCP にダウングレードされないように、関連するポッドのネットワーク名前空間で SMC ホワイトリストと構成を慎重に維持する必要があります。 サービスメッシュ (ASM) は、制御可能なネットワーク環境 (つまり、クラスター) で SMC 最適化機能を提供し、ASM インスタンス内のポッド間のネットワーク通信を自動的に最適化します。 特定の SMC 構成を気にする必要はありません。

前提条件

クラスターが ASM インスタンスに追加されていること。

制限事項

手順

手順 1:関連ノードを初期化する

SMC は、elastic RDMA インターフェイス (ERI) を使用してネットワーク通信を高速化します。 SMC を有効にする前に、関連ノードを初期化する必要があります。

  1. Alibaba Cloud Linux 3 のカーネルバージョンを 5.10.134-17.3 以降にアップグレードします。 詳細については、「カーネルバージョンを変更する」をご参照ください。

  2. ノードに erdma-controller をインストールし、Shared Memory Communication over RDMA (SMC-R) を有効にします。 詳細については、「eRDMA を使用してコンテナーネットワーキングを高速化する」をご参照ください。

手順 2:テストアプリケーションをデプロイする

  1. 以下のテストで使用されるデフォルトの名前空間に対して、自動サイドカープロキシインジェクションを有効にします。 詳細については、「自動サイドカープロキシインジェクションを有効にする」をご参照ください。

  2. 以下の内容を含む fortioserver.yaml ファイルを作成します。

    展開して fortioserver.yaml ファイルを表示する

    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: fortioserver
    spec:
      ports:
      - name: http-echo
        port: 8080
        protocol: TCP
      - name: tcp-echoa
        port: 8078
        protocol: TCP
      - name: grpc-ping
        port: 8079
        protocol: TCP
      selector:
        app: fortioserver
      type: ClusterIP
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: fortioserver
      name: fortioserver
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: fortioserver
      template:
        metadata:
          labels:
            app: fortioserver
          annotations:
            sidecar.istio.io/inject: "true"
            sidecar.istio.io/proxyCPULimit: 2000m
            proxy.istio.io/config: |
              concurrency: 2 
        spec:
          shareProcessNamespace: true
          containers:
          - name: captured
            image: fortio/fortio:latest_release
            ports:
            - containerPort: 8080
              protocol: TCP
            - containerPort: 8078
              protocol: TCP
            - containerPort: 8079
              protocol: TCP
          - name: anolis
            securityContext:
              runAsUser: 0
            image: openanolis/anolisos:latest
            args:
            - /bin/sleep
            - 3650d
    ---
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-switch: "off"
      name: fortioclient
    spec:
      ports:
      - name: http-report
        port: 8080
        protocol: TCP
      selector:
        app: fortioclient
      type: LoadBalancer
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: fortioclient
      name: fortioclient
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: fortioclient
      template:
        metadata:
          annotations:
            sidecar.istio.io/inject: "true"
            sidecar.istio.io/proxyCPULimit: 4000m
            proxy.istio.io/config: |
               concurrency: 4
          labels:
            app: fortioclient
        spec:
          shareProcessNamespace: true
          affinity:
            podAntiAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
              - labelSelector:
                  matchExpressions:
                  - key: app
                    operator: In
                    values:
                    - fortioserver
                topologyKey: "kubernetes.io/hostname"
          containers:
          - name: captured
            volumeMounts:
            - name: shared-data
              mountPath: /var/lib/fortio
            image: fortio/fortio:latest_release
            ports:
            - containerPort: 8080
              protocol: TCP
          - name: anolis
            securityContext:
              runAsUser: 0
            image: openanolis/anolisos:latest
            args:
            - /bin/sleep
            - 3650d
          volumes:
          - name: shared-data
            emptyDir: {}
    
  3. kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスターに接続し、次のコマンドを実行してテストアプリケーションをデプロイします。

    kubectl apply -f fortioserver.yaml
  4. 次のコマンドを実行して、テストアプリケーションのステータスを表示します。

    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 アプリケーションのコンソールページを開きます。

  1. kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスターに接続し、次のコマンドを実行して fortioclient アプリケーションのポート 8080 をローカルポート 8080 にマップします。

    kubectl port-forward service/fortioclient 8080:8080
  2. ブラウザのアドレスバーに http://localhost:8080/fortio と入力して fortioclient アプリケーションのコンソールにアクセスし、関連する構成を変更します。

    image

    前の図に示されているページのパラメーター設定を、次の表に従って変更します。

    パラメーター

    [URL]

    http://fortioserver:8080/echo

    [QPS]

    100000

    [期間]

    30s

    [スレッド/同時接続数]

    64

    [ペイロード]

    次の文字列 (128 バイト) を入力します。

    xhsyL4ELNoUUbC3WEyvaz0qoHcNYUh0j2YHJTpltJueyXlSgf7xkGqc5RcSJBtqUENNjVHNnGXmoMyILWsrZL1O2uordH6nLE7fY6h5TfTJCZtff3Wib8YgzASha8T8g

  3. 構成が完了したら、ページの下部にある [開始] をクリックしてテストを開始します。 プログレスバーが最後まで到達すると、テストは終了します。

    image

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

    image

    テスト結果ページでは、x 軸はリクエストのレイテンシを示しています。 ヒストグラムの x 軸のデータ分布を観察することで、リクエストのレイテンシの分布を取得できます。 紫色の曲線は、さまざまな応答時間内に処理されたリクエストの数を示しています。 y 軸は、処理されたリクエストの数を示しています。 ヒストグラムの上部には、リクエストの P50、P75、P90、P99、および P99.9 レイテンシが示されています。 ベースライン環境のテストデータを取得したら、アプリケーションに対して SMC を有効にして、SMC が有効になった後のアプリケーションのパフォーマンスをテストする必要があります。

手順 4:ASM インスタンスとワークロードに対して SMC ベースのネットワーク通信アクセラレーションを有効にする

  1. 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: true
  2. kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスターに接続します。 次に、次のコマンドを実行して fortioserver アプリケーションと fortioclient アプリケーションのデプロイメントを変更し、fortioserver アプリケーションと fortioclient アプリケーションが存在するポッドに smc.asm.alibabacloud.com/enabled: "true" アノテーションを追加します。

    ASM インスタンスに対して SMC を有効にした後、ワークロードに対して SMC をさらに有効にする必要があります。 ワークロードに対して SMC を有効にするには、smc.asm.alibabacloud.com/enabled: "true" アノテーションを関連するポッドに追加します。 クライアント側とサーバー側の両方でワークロードに対して SMC を有効にする必要があります

    1. fortioclient アプリケーションのデプロイメントを変更します。

      $ kubectl edit deployment fortioclient
      
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        ......
        name: fortioclient
      spec:
        ......
        template:
          metadata:
            ......
            annotations:
              smc.asm.alibabacloud.com/enabled: "true"
              
    2. 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 アプリケーションのポートをローカルポートに再度マップする必要があります。 次に、テストを再度開始し、テストが完了するまで待ちます。

image

SMC を有効にしていない場合のテスト結果と比較すると、ASM インスタンスに対して SMC を有効にした後、リクエストのレイテンシが減少し、クエリ/秒 (QPS) が大幅に増加していることがわかります。

FAQ

  1. SMC を有効にした後にデータベースサービスにアクセスできない場合はどうすればよいですか?

    この問題は、TCP 仕様に準拠していないロードバランサーを介してデータベースサービスにアクセスするときに、SMC プロトコルの TCP 種別 254 が誤って識別されるために発生します。

    次の手順を実行して、この問題を解決できます。

    1. ノードに aliyun-smc-extensions ツールキットをインストールします。

      sudo yum install -y aliyun-smc-extensions
    2. aliyunsmc-check を使用して、最終 URL の通信リンクを確認します。

      aliyunsmc-check syn_check --url <url>

      aliyunsmc-check は、最終 URL への TCP オプションの再生、競合、および過度の長さなどの問題を識別できます。 出力例:

      p910680

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