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

Alibaba Cloud Linux:Alibaba Cloud Linux 3でXPSを設定する方法と設定の影響

最終更新日:Jul 05, 2024

ECSコンソールでAlibaba Cloud Linux 3オペレーティングシステムを実行するElastic Compute Service (ECS) インスタンスを作成すると、インスタンスに対して送信パケットステアリング (XPS) が自動的に有効になります。 Alibaba Cloud Linux 3オペレーティングシステムを実行するECSインスタンスでXPSが無効になっている場合、このトピックで説明する操作を実行して、インスタンスのXPSを設定できます。

XPSの概要

XPSは、データパケットがマルチキューネットワークインターフェース (NIC) 上で送信されるときに送信キューを自動的に選択するメカニズムです。 XPSは、送信キューとCPUセット間のマッピングを作成します。 CPUがデータパケットを送信するために使用される場合、カーネルは、データパケットを送信するためにCPUにマッピングされた送信キューを自動的に選択する。 カーネルは、データフローの最初のパケットに対して選択された送信キューを記録し、キューを使用してフロー内の後続のパケットを送信する。 この送信メカニズムは、各パケットに対する送信キューを選択するために使用される計算オーバーヘッドを低減する。

XPSは次の利点を提供します。

  • XPSは、同じ送信キューに対する異なるCPU間の競合を緩和する。 これは、キューがデータを送信するために使用されるときのロック競合を低減し、データパケットの送信効率を高める。

  • XPSは、送信キューがバインドされているvirtio NICのアフィニティと一致する送信キューとCPUの間のマッピングを作成します。 これにより、パケット伝送中のキャッシュミスおよびロック競合によるキャッシュミスの可能性が低減され、ネットワーク伝送性能が向上する。

XPSの設定

  1. XPSを設定するECSインスタンスに接続します。

    詳細については、「パスワードまたはキーを使用したLinuxインスタンスへの接続」をご参照ください。

  2. 次のコマンドを実行して、ECSインスタンスにXPSが設定されているかどうかを確認します。 カーネルでCONFIG_XPSが有効になっていることを確認します。

    この例では、eth0 NICが使用されます。

    cat /sys/class/net/eth0/queues/tx-*/xps_cpus

    次の図に示すように、すべてゼロのコマンド出力が返された場合、ECSインスタンスのXPSは無効になります。 この場合は、以降の操作に進んでXPSを設定します。

    image.png

  3. NICで使用可能なCPUおよび送信キューの数に基づいて、すべてのvirtio NICのXPS設定を構成します。 XPS設定が、各送信キューにCPUを割り当てるためにカーネルが使用するポリシーに準拠していることを確認してください。

    1. 次のコマンドを実行して、現在のディレクトリにXPS設定を構成するためのファイルを作成します。 たとえば、xps_config.pyファイルを作成します。

      vim xps_config.py
    2. Iキーを押して挿入モードに入り、次の内容をxps_config.pyファイルにコピーします。

      # encoding: utf-8
      # This implements the default configuration of kernel XPS.
      # Note: The configuration of this script only applies to virtio-net nics.
      
      import os
      import multiprocessing
      
      def setup_xps(dev):
          cpu_count = multiprocessing.cpu_count()
          txq_dir = "/sys/class/net/{0}/queues/".format(dev)
          queue_count = len([f for f in os.listdir(txq_dir) if f.startswith("tx-")])
          if queue_count <= 1:
              print("The number of txq: {0} <= 1, exit...".format(queue_count))
              return
      
          group, stragglers = divmod(cpu_count, queue_count)
          stragglers = 0 if group == 0 else stragglers
          group = max(group, 1)
          cpu = 0
          queue_final_bitmap = ""
      
          # We do not need to care about numa node information
          # So we must pay attention to the perfermance in multiple numa node scene!!
          for i in range(queue_count):
              group_size = (group + 1) if i < stragglers else group
              queue_per_bitmap = 0
              for j in range(group_size):
                  cpu_bitmap = 1 << cpu
                  cpu += 1
                  queue_per_bitmap |= cpu_bitmap
                  cpu = 0 if cpu >= cpu_count else cpu
                  queue_final_bitmap = hex(queue_per_bitmap)[2:]
                  if "L" in queue_final_bitmap:
                          queue_final_bitmap = queue_final_bitmap.replace("L", "")
      
              result_bitmap = outputSeg(queue_final_bitmap)
              eth_txq_path = "/sys/class/net/{0}/queues/tx-{1}/xps_cpus".format(dev, i)
              with open(eth_txq_path, "w") as fxps:
                  fxps.write(result_bitmap)
      
          print("{0}'s XPS configuration done.".format(dev))
      
      def outputSeg(bitmap):
          result = ""
          count = 0
          for char in reversed(bitmap):
              if count % 8 == 0 and count != 0:
                  result = "," + result
              result = char + result
              count += 1
          return result
      
      def process_devs():
          eth_dir = "/sys/class/net/"
          eth_folders = [f for f in os.listdir(eth_dir) if os.path.isdir(os.path.join(eth_dir, f)) and f.startswith("eth")]
          for eth_folder in eth_folders:
              eth = eth_folder.split("/")[-1]
              setup_xps(eth)
      
      if __name__ == '__main__':
          process_devs()
    3. Escキーを押して :wqと入力し、ファイルを保存して閉じます。

  4. 次のコマンドを実行してXPSを設定します。

    sudo python3 xps_config.py
  5. (オプション) 次のコマンドを実行して、XPS設定が完了しているかどうかを確認します。

    この例では、ECSインスタンスの32個のCPUがeth0 NICの8個の送信キューにマッピングされます。

    cat /sys/class/net/eth0/queues/tx-*/xps_cpus

    次のコマンド出力は、XPSが設定されていることを示します。 コマンドの出力は、CPUまたはキューの数によって異なります。

    image.png

構成の影響

XPSを設定する目的は、ネットワークパフォーマンスを向上させることです。 ただし、XPSの設定後にネットワークパフォーマンスが影響を受ける場合があります。 XPSがネットワークパフォーマンスに影響する場合は、次のコマンドを実行してXPS設定をクリアします。 この例では、eth0 NICが使用されます。

sudo sh -c 'for txq in /sys/class/net/eth0/queues/tx-*; do echo 0 > $txq/xps_cpus; done'