全部產品
Search
文件中心

Alibaba Cloud Linux:Alibaba Cloud Linux 3系統配置XPS的方法及影響說明

更新時間:Jul 17, 2024

通過ECS控制台新購買的Alibaba Cloud Linux 3執行個體已經預設啟用了XPS機制。如果發現您的存量ECS執行個體尚未啟用XPS,您可以通過本文的操作方法來配置XPS。

XPS概述

XPS(Transmit Packet Steering)是一種在多隊列網卡上發送資料報文時,自動選擇發送隊列的機制。它通過建立發送隊列和CPU集合之間的映射關係,使得核心能夠根據這一映射關係,在某個CPU發送資料報文時,自動選擇與該CPU相關聯的發送隊列來完成報文傳輸。核心會記錄資料流的首個報文選擇的發送隊列,並將該隊列用於後續報文的傳輸,從而減少為每個報文計算髮送隊列的開銷。

XPS的優勢體現如下:

  • 緩解不同CPU對同一個發送隊列的競爭,進而降低網卡隊列發送資料時的鎖衝突,提升資料報文發送效率。

  • XPS配置的發送隊列與CPU之間的映射關係與virtio網卡綁定的發送隊列的親和性一致,這降低了報文發送過程中緩衝失效(cache miss)的可能性和鎖競爭導致的緩衝失效的可能性,從而提高了網路發送效能。

配置XPS

  1. 遠端連線目標ECS執行個體。

    具體操作,請參見通過密碼或密鑰認證登入Linux執行個體

  2. 運行以下命令,檢查目標ECS執行個體是否配置了XPS(確保核心使能了CONFIG_XPS)。

    以網卡eth0為例:

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

    如下圖所示,如果命令輸出結果全部為0,則表示ECS執行個體沒有啟用XPS,請繼續執行後續步驟配置XPS。

    image.png

  3. 為具有不同CPU和發送隊列數目的所有virtio網卡設定和核心策略相同的XPS配置。

    1. 運行以下命令,在目前的目錄下建立檔案,例如xps_config.py,用於設定XPS配置。

      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 = output_seg(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 output_seg(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、8個發送隊列的網卡eth0為例:

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

    如下圖所示(CPU數目不同或者隊列數目不同,顯示結果不同),說明XPS已經配置成功。

    image.png

影響說明

儘管配置XPS的目的是為了提升網路效能,但可能會出現配置XPS後網路效能受到影響。如果您遇到這種情況,可以運行以下命令來清除XPS配置。以網卡eth0為例:

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