共用方式為


在 Linux 虛擬機器中設定 DPDK

Azure 上的資料平面開發套件 (DPDK) 針對效能密集應用程式,提供更快速的使用者空間封包處理架構。 此架構會略過虛擬機器的核心網路堆疊。

在使用核心網路堆疊的傳統封包處理中,程序是插斷導向的。 當網路介面接收連入封包時,會有一個核心插斷可處理從核心空間到使用者空間的封包與環境切換。 DPDK 可免除環境切換與插斷導向方法,改為使用利用輪詢模式驅動程式的使用者空間實作,而達到快速的封包處理。

DPDK 由一組使用者空間程式庫組成,可提供對低層級資源的存取。 這些資源包括硬體、邏輯核心、記憶體管理與網路介面卡的輪詢模式驅動程式。

DPDK 可以在 Azure 虛擬機器中執行,並支援多個作業系統散發套件。 DPDK 在驅使網路功能虛擬化實作方面有關鍵效能差異。 這些實作可為網路虛擬設備 (NVA) 形式,例如虛擬路由器、防火牆、VPN、負載平衡器、進化型封包核心與阻斷服務 (DDoS) 應用程式。

您可以在這裡取得 MANA VM 上 DPDK 的設定指示清單:Linux 上的 Microsoft Azure 網路介面卡 (MANA) 和 DPDK

優點

更高的每秒封包數 (PPS):略過核心並掌控使用者空間中的封包,可透過消除環境切換來減少週期計數。 它也可以改善 Azure Linux 虛擬機器中每秒處理的封包速率。

支援的作業系統最低版本

支援以下來自 Azure Marketplace 的散發套件:

Linux 作業系統 核心版本
Ubuntu 18.04 4.15.0-1014-azure+
SLES 15 SP1 4.12.14-8.19-azure+
RHEL 7.5 3.10.0-862.11.6.el7.x86_64+
Debian 10 4.19.0-1-cloud+

註明的版本是最低需求。 也支援較新的版本。

您可以在這裡取得 MANA VM 上 DPDK 的需求清單:Linux 上的 Microsoft Azure 網路介面卡 (MANA) 和 DPDK

自訂核心支援

針對未列出的任何 Linux 核心版本,請參閱用於建置經 Azure 調整之 Linux 核心的補充程式。 如需詳細資訊,您也可以連絡 aznetdpdk@microsoft.com

區域支援

所有 Azure 區域都支援 DPDK。

必要條件

必須在 Linux 虛擬機器上啟用加速網路。 虛擬機器應該有至少兩個網路介面,其中一個介面用於管理。 不建議在管理介面上啟用加速網路。 了解如何建立已啟用加速網路的 Linux 虛擬機器

此外,DPDK 會使用 RDMA 動詞在網路介面卡上建立資料佇列。 在 VM 中,確定已載入正確的 RDMA 核心驅動程式。 視 VM 大小而定,驅動程式可以是 mlx4_ib、mlx5_ib 或 mana_ib。

您可以在這裡取得 MANA VM 的 DPDK 安裝指示:Linux 上的 Microsoft Azure 網路介面卡 (MANA) 和 DPDK

安裝組建相依性

RHEL7.5

yum -y groupinstall "Infiniband Support"
sudo dracut --add-drivers "mlx4_en mlx4_ib mlx5_ib" -f
yum install -y gcc kernel-devel-`uname -r` numactl-devel.x86_64 librdmacm-devel libmnl-devel meson

手動編譯和安裝 DPDK

  1. 下載最新的 DPDK。 建議為 Azure 採用 22.11 版 LTS 或更新版本。

  2. 使用 meson builddir 建置預設組態。

  3. 使用 ninja -C builddir 編譯。

  4. 使用 DESTDIR=<output folder> ninja -C builddir install 安裝。

設定執行階段環境

重新啟動之後,執行下列命令一次:

  1. Hugepage

    • 針對每個 numa 節點執行一次下列命令,以設定 Hugepage:
     echo 1024 | sudo tee /sys/devices/system/node/node*/hugepages/hugepages-2048kB/nr_hugepages
    
    • 使用 mkdir /mnt/huge 建立可供掛接的目錄。

    • 使用 mount -t hugetlbfs nodev /mnt/huge 掛接 Hugepage。

    • 使用 grep Huge /proc/meminfo 檢查 Hugepage 是否已保留。

    • 上述範例適用於 2M Hugepage。 同時適用於 1G Hugepage。

    注意

    依照 DPDK 的指示可以修改 grub 檔案,以便在開機時保留 Hugepage。 指示位於頁面底部。 當您使用 Azure Linux 虛擬機器時,請改為修改 /etc/config/grub.d 下的檔案,以在重新開機期間保留 Hugepage。

  2. MAC 和 IP 位址: 使用 ifconfig –a 來檢視網路介面的 MAC 和 IP 位址。 VF 網路介面和 NETVSC 網路介面都有相同的 MAC 位址,但僅限於具有 IP 位址的 NETVSC 網路介面。 VF 介面會當作 NETVSC 介面的從屬介面執行。

  3. PCI 位址

    • 使用 來了解哪個 PCI 位址要用於 ethtool -i <vf interface name>VF

    • 如果 eth0 已啟用網路加速,請確定 testpmd 不會意外接管 eth0VF pci 裝置。 若 DPDK 應用程式意外取代管理網路介面並導致您的 SSH 連線中斷,請使用序列主控台來停止 DPDK 應用程式。 您也可以使用序列主控台來停止或啟動虛擬機器。

  4. 在每次開機時使用 modprobe -a ib_uverbs 載入 ibuverbs。 僅限於 SLES 15,也可使用 modprobe -a mlx4_ib 載入 mlx4_ib

Master PMD

DPDK 應用程式必須透過在 Azure 中公開的主要 PMD 執行。 如果應用程式直接透過 VF PMD 執行,則不會收到所有傳送到 VM 的封包,因為某些封包會透過綜合介面顯示。 DPDK 支援兩種類型的主要 PMD:NetVSC PMD 和保全 PMD。 主要 PMD 可保證應用程式會接收所有向其傳送的封包, 同時也會確認應用程式透過主要 PMD 持續在 DPDK 模式中執行,即使 VF 已在系統為主機提供服務時遭到撤銷亦然。

NetVSC PMD

NetVSC 是建議在 Azure 中以主要 PMD 形式所執行的 PMD。 該 PMD 可保證應用程式會接收所有向其傳送的封包, 它也會確定應用程式持續在 DPDK 模式中執行,即使 VF 已在系統為主機提供服務時被叫用也一樣。 如需如何使用及設定 NetVSC PMD 的詳細資訊,請參閱 (https://doc.dpdk.org/guides/nics/netvsc.html)。

保全 PMD

請注意:不建議您在 Azure 中使用保全 PMD 執行作業。 如果您的 DPDK 版本是 22.11 LTS 或更新版本,則建議您使用 NetVSC PMD。

或者,您也可以透過保全 PMD 執行 DPDK 應用程式。 如需有關保全 PMD 的詳細資訊,請參閱保全輪詢模式驅動程式庫

執行 testpmd

若要在 root 模式中執行 testpmd,請在 testpmd 命令之前使用 sudo

基本:例行性檢查、保全配接器初始化

  1. 執行下列命令來啟動單一連接埠 testpmd 應用程式:

    testpmd -w <pci address from previous step> \
      -- -i \
      --port-topology=chained
    
  2. 執行下列命令來啟動雙重連接埠 testpmd 應用程式:

    testpmd -w <pci address nic1> \
    -w <pci address nic2> \
    -- -i
    

啟動後,執行 show port info all 來檢查連接埠資訊。 您應該會看到一或兩個 net_netvsc 的 DPDK 連接埠。

  1. 使用 start <port> /stop <port> 來啟動流量。

前述命令會在互動模式中啟動 testpmd,這是嘗試執行 testpmd 命令的建議做法。

基本:單一傳送者/單一接收者

下列命令會定期列印每秒封包數的統計資料:

  1. 在 TX 端上,執行下列命令:

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address of the device you plan to use> \
      -- --port-topology=chained \
      --nb-cores <number of cores to use for test pmd> \
      --forward-mode=txonly \
      --eth-peer=<port id>,<receiver peer MAC address> \
      --stats-period <display interval in seconds>
    
  2. 在 RX 端上,執行下列命令:

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address of the device you plan to use> \
      -- --port-topology=chained \
      --nb-cores <number of cores to use for test pmd> \
      --forward-mode=rxonly \
      --eth-peer=<port id>,<sender peer MAC address> \
      --stats-period <display interval in seconds>
    

當您在虛擬機器上執行前述命令時,變更 app/test-pmd/txonly.c 中的 IP_SRC_ADDRIP_DST_ADDR,以在編譯前符合虛擬機器的實際 IP 位址。 否則,封包會在到達接收者之前捨棄。

進階:單一傳送者/單一轉寄者

下列命令會定期列印每秒封包數的統計資料:

  1. 在 TX 端上,執行下列命令:

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address of the device you plan to use> \
      -- --port-topology=chained \
      --nb-cores <number of cores to use for test pmd> \
      --forward-mode=txonly \
      --eth-peer=<port id>,<receiver peer MAC address> \
      --stats-period <display interval in seconds>
    
  2. 在 FWD 端上,執行下列命令:

    testpmd \
      -l <core-list> \
      -n <num of mem channels> \
      -w <pci address NIC1> \
      -w <pci address NIC2> \
      -- --nb-cores <number of cores to use for test pmd> \
      --forward-mode=io \
      --eth-peer=<recv port id>,<sender peer MAC address> \
      --stats-period <display interval in seconds>
    

當您在虛擬機器上執行前述命令時,變更 app/test-pmd/txonly.c 中的 IP_SRC_ADDRIP_DST_ADDR,以在編譯前符合虛擬機器的實際 IP 位址。 否則,封包會在到達轉寄者之前捨棄。 您無法讓第三部電腦接收轉送流量,因為 testpmd 轉送者不會修改第 3 層位址 (除非您變更一些程式碼)。

sudo yum install -y dpdk

參考資料