使用 DPDK 加快網路封包處理速度


本文說明如何在虛擬機器 (VM) 執行個體上啟用資料平面開發套件 (DPDK),加快網路封包處理速度。

DPDK 是一種架構,適用於需要快速封包處理、低延遲和穩定效能的效能密集型應用程式。DPDK 提供一組資料層程式庫和網路介面控制器 (NIC),可略過核心網路,直接在使用者空間中執行。舉例來說,在 VM 上啟用 DPDK,有助於執行下列作業:

  • 網路功能虛擬化 (NFV) 部署作業

  • 軟體定義網路 (SDN) 應用程式

  • 影片串流或網際網路通訊協定語音應用程式

您可以使用下列其中一種虛擬 NIC (vNIC) 類型,在 VM 上執行 DPDK:

  • 建議:gVNIC

    高效能、安全且可擴充的虛擬網路介面,專為 Compute Engine 設計,可取代 virtIO,成為新一代 vNIC。

  • VirtIO-Net

    開放原始碼乙太網路驅動程式,可讓 VM 有效率地存取實體硬體,例如區塊儲存空間和網路介面卡。

在虛擬環境中執行 DPDK (而非實體硬體) 的一個問題是,虛擬環境缺少 SR-IOV 和 I/O 記憶體管理單元 (IOMMU) 的支援,無法用於高效能應用程式。如要克服這項限制,您必須使用下列其中一個驅動程式,在訪客實體位址上執行 DPDK,而非主機虛擬位址:

事前準備

  • 如果尚未設定驗證,請先完成設定。 「驗證」是指驗證身分的程序,確認您有權存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,請選取下列其中一個選項,向 Compute Engine 進行驗證:

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

      1. After installing the Google Cloud CLI, initialize it by running the following command:

        gcloud init

        If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

      2. Set a default region and zone.
      3. REST

        如要在本機開發環境中使用本頁的 REST API 範例,請使用您提供給 gcloud CLI 的憑證。

          After installing the Google Cloud CLI, initialize it by running the following command:

          gcloud init

          If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

        詳情請參閱 Google Cloud 驗證說明文件中的「Authenticate for using REST」。

需求條件

建立要執行 DPDK 的 VM 時,請確認下列事項:

  • 為避免執行應用程式時網路連線中斷,請使用兩個虛擬私有雲網路:

    • 控制層的虛擬私有雲網路

    • 資料層的虛擬私有雲網路

  • 這兩個虛擬私有雲網路都必須指定下列項目:

    • 具有專屬 IP 位址範圍的子網路

    • 子網路位於相同區域

    • 相同類型的 VNIC,也就是 gVNIC 或 VirtIO-Net

  • 建立 VM 時:

    • 您必須指定與兩個 VPC 網路子網路相同的區域。

    • 您必須指定要搭配 DPDK 使用的 vNIC 類型。

    • 您必須為 gVNIC 或 VirtIO-Net 指定支援的機器系列

限制

在 VM 上執行 DPDK 時,會受到下列限制:

設定 VM 執行 DPDK

本節說明如何建立 VM 來執行 DPDK。

建立虛擬私有雲網路

使用 Google Cloud 控制台、Google Cloud CLI 或 Compute Engine API,為資料層和控制層建立兩個 VPC 網路。您稍後可以在建立 VM 時指定這些網路。

控制台

  1. 建立資料層的虛擬私有雲網路:

    1. 在 Google Cloud 控制台中,前往「VPC networks」(虛擬私有雲網路)

      前往「VPC networks」(虛擬私有雲網路)

      「VPC networks」(VPC 網路) 頁面隨即開啟。

    2. 按一下「建立虛擬私有雲網路」

      「建立虛擬私有雲網路」頁面隨即開啟。

    3. 在「Name」(名稱) 欄位中,輸入網路的名稱。

    4. 在「New subnet」(新的子網路) 區段中,執行下列操作:

      1. 在「Name」(名稱) 欄位中,輸入子網路的名稱。

      2. 在「Region」(區域) 選單中,選取子網路的區域。

      3. 選取「IPv4 (單一堆疊)」 (預設)。

      4. 在「IPv4 range」(IPv4 範圍) 中,以 CIDR 標記法輸入「有效的 IPv4 範圍」位址。

      5. 按一下 [完成]

    5. 點選「建立」

      「VPC networks」(VPC 網路) 頁面隨即開啟。建立虛擬私有雲網路最多可能需要一分鐘。

  2. 為控制平面建立虛擬私有雲網路,並設定防火牆規則,允許透過 SSH 連線至 VM:

    1. 再次按一下「建立虛擬私有雲網路」

      「建立虛擬私有雲網路」頁面隨即開啟。

    2. 在「Name」(名稱) 欄位中,輸入網路的名稱。

    3. 在「New subnet」(新的子網路) 區段中,執行下列操作:

      1. 在「Name」(名稱) 欄位中,輸入子網路的名稱。

      2. 在「Region」(區域) 選單中,選取您為資料平面網路子網路指定的相同區域。

      3. 選取「IPv4 (單一堆疊)」 (預設)。

      4. 在「IPv4 range」(IPv4 範圍) 中,以 CIDR 標記法輸入「有效的 IPv4 範圍」位址。

      5. 按一下 [完成]

    4. 在「IPv4 防火牆規則」分頁中,選取「NETWORK_NAME-allow-ssh」核取方塊。

      其中 NETWORK_NAME 是您在先前步驟中指定的網路名稱。

    5. 點選「建立」

      「VPC networks」(VPC 網路) 頁面隨即開啟。建立虛擬私有雲網路最多可能需要一分鐘。

gcloud

  1. 如要為資料層建立虛擬私有雲網路,請按照下列步驟操作:

    1. 使用 gcloud compute networks create 指令建立虛擬私有雲網路,當中包含手動建立的子網路,並將 --subnet-mode 旗標設為 custom

      gcloud compute networks create DATA_PLANE_NETWORK_NAME \
          --bgp-routing-mode=regional \
          --mtu=MTU \
          --subnet-mode=custom
      

      更改下列內容:

      • DATA_PLANE_NETWORK_NAME:資料層的 VPC 網路名稱。

      • MTU:最大傳輸單位 (MTU),也就是網路的最大封包大小。這個值必須介於 13008896 之間。預設值為 1460。將 MTU 設為高於 1460 的值之前,請參閱「最大傳輸單位」。

    2. 使用 gcloud compute networks subnets create 指令,為您剛建立的虛擬私有雲資料平面網路建立子網路。

      gcloud compute networks subnets create DATA_PLANE_SUBNET_NAME \
          --network=DATA_PLANE_NETWORK_NAME \
          --range=DATA_PRIMARY_RANGE \
          --region=REGION
      

      更改下列內容:

      • DATA_PLANE_SUBNET_NAME:資料平面網路的子網路名稱。

      • DATA_PLANE_NETWORK_NAME:您在先前步驟中指定的資料平面網路名稱。

      • DATA_PRIMARY_RANGE:以 CIDR 標記法表示的子網路有效 IPv4 範圍

      • REGION:要建立子網路的區域。

  2. 如要為控制平面建立虛擬私有雲網路,並設定允許透過 SSH 連線至 VM 的防火牆規則,請按照下列步驟操作:

    1. 使用 gcloud compute networks create 指令建立虛擬私有雲網路,當中包含手動建立的子網路,並將 --subnet-mode 旗標設為 custom

      gcloud compute networks create CONTROL_PLANE_NETWORK_NAME \
          --bgp-routing-mode=regional \
          --mtu=MTU \
          --subnet-mode=custom
      

      更改下列內容:

      • CONTROL_PLANE_NETWORK_NAME:控制平面的 VPC 網路名稱。

      • MTU:MTU,也就是網路的最大封包大小。這個值必須介於 13008896 之間。預設值為 1460。將 MTU 設為高於 1460 的值之前,請參閱「最大傳輸單位」。

    2. 使用 gcloud compute networks subnets create 指令,為剛建立的虛擬私有雲控制平面網路建立子網路。

      gcloud compute networks subnets create CONTROL_PLANE_SUBNET_NAME \
          --network=CONTROL_PLANE_NETWORK_NAME \
          --range=CONTROL_PRIMARY_RANGE \
          --region=REGION
      

      更改下列內容:

      • CONTROL_PLANE_SUBNET_NAME:控制層網路的子網路名稱。

      • CONTROL_PLANE_NETWORK_NAME:您在先前步驟中指定的控制平面網路名稱。

      • CONTROL_PRIMARY_RANGE:以 CIDR 標記法表示的子網路有效 IPv4 範圍

      • REGION:要建立子網路的地區,必須與您在資料平面網路的子網路中指定的地區相符。

    3. 使用 gcloud compute firewall-rules create 指令建立虛擬私有雲防火牆規則,允許透過 --allow 旗標設為 tcp:22 的控制平面網路進行 SSH 連線。

      gcloud compute firewall-rules create FIREWALL_RULE_NAME \
          --action=allow \
          --network=CONTROL_PLANE_NETWORK_NAME \
          --rules=tcp:22
      

      更改下列內容:

      • FIREWALL_RULE_NAME:防火牆規則的名稱。

      • CONTROL_PLANE_NETWORK_NAME:您在先前步驟中建立的控制平面網路名稱。

API

  1. 如要為資料層建立虛擬私有雲網路,請按照下列步驟操作:

    1. 建立虛擬私有雲網路,並透過向 networks.insert 方法發出 POST 要求,手動建立子網路,並將 autoCreateSubnetworks 欄位設為 false

      POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks
      
      {
        "autoCreateSubnetworks": false,
        "name": "DATA_PLANE_NETWORK_NAME",
        "mtu": MTU
      }
      

      更改下列內容:

      • PROJECT_ID:目前專案的專案 ID。

      • DATA_PLANE_NETWORK_NAME:資料平面網路的名稱。

      • MTU:最大傳輸單位 (MTU),也就是網路的最大封包大小。這個值必須介於 13008896 之間。預設值為 1460。將 MTU 設為高於 1460 的值之前,請參閱「最大傳輸單位」。

    2. 如要為虛擬私有雲資料層網路建立子網路,請對 subnetworks.insert 方法發出 POST 要求。

      POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/subnetworks
      
      {
        "ipCidrRange": "DATA_PRIMARY_RANGE",
        "name": "DATA_PLANE_SUBNET_NAME",
        "network": "projects/PROJECT_ID/global/networks/DATA_PLANE_NETWORK_NAME"
      }
      

      更改下列內容:

      • PROJECT_ID:資料平面網路所在專案的專案 ID。

      • REGION:要建立子網路的區域。

      • DATA_PRIMARY_RANGE:新子網路的主要 IPv4 範圍,採用 CIDR 標記法。

      • DATA_PLANE_SUBNET_NAME:您在上一步建立的資料平面網路子網路名稱。

      • DATA_PLANE_NETWORK_NAME:您在上一步建立的資料平面網路名稱。

  2. 如要為控制平面建立虛擬私有雲網路,並設定允許透過 SSH 存取 VM 的防火牆規則,請按照下列步驟操作:

    1. 建立虛擬私有雲網路,並透過向 networks.insert 方法發出 POST 要求,手動建立子網路,並將 autoCreateSubnetworks 欄位設為 false

      POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks
      
      {
        "autoCreateSubnetworks": false,
        "name": "CONTROL_PLANE_NETWORK_NAME",
        "mtu": MTU
      }
      

      更改下列內容:

      • PROJECT_ID:目前專案的專案 ID。

      • CONTROL_PLANE_NETWORK_NAME:控制平面的網路名稱。

      • MTU:MTU,也就是網路的最大封包大小。這個值必須介於 13008896 之間。預設值為 1460。將 MTU 設為高於 1460 的值之前,請參閱「最大傳輸單位」。

    2. 如要為虛擬私有雲資料控制網路建立子網路,請對 subnetworks.insert 方法發出 POST 要求。

      POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/subnetworks
      
      {
        "ipCidrRange": "CONTROL_PRIMARY_RANGE",
        "name": "CONTROL_PLANE_SUBNET_NAME",
        "network": "projects/PROJECT_ID/global/networks/CONTROL_PLANE_NETWORK_NAME"
      }
      

      更改下列內容:

      • PROJECT_ID:控制平面網路所在的專案 ID。

      • REGION:要建立子網路的區域。

      • CONTROL_PRIMARY_RANGE:新子網路的主要 IPv4 範圍,採用 CIDR 標記法。

      • CONTROL_PLANE_SUBNET_NAME:您在上一步建立的控制平面網路子網路名稱。

      • CONTROL_PLANE_NETWORK_NAME:您在上一步建立的控制平面網路名稱。

    3. 建立虛擬私有雲防火牆規則,允許透過向 firewalls.insert 方法發出 POST 要求,以 SSH 連線至控制平面網路。 在要求中,將 IPProtocol 欄位設為 tcp,並將 ports 欄位設為 22

      POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls
      
      {
        "allowed": [
          {
            "IPProtocol": "tcp",
            "ports": [ "22" ]
          }
        ],
        "network": "projects/PROJECT_ID/global/networks/CONTROL_PLANE_NETWORK_NAME"
      }
      

      更改下列內容:

      • PROJECT_ID:控制平面網路所在的專案 ID。

      • CONTROL_PLANE_NETWORK_NAME:您在先前步驟中建立的控制平面網路名稱。

如要進一步瞭解建立虛擬私有雲網路時的設定選項,請參閱「建立及管理虛擬私有雲網路」。

建立使用虛擬私有雲網路的 DPDK VM

使用 Google Cloud 主控台、gcloud CLI 和 Compute Engine API,在先前建立的兩個 VPC 網路中,建立啟用 gVNIC 或 virtIO-Net 的 VM。

建議指定 Ubuntu LTSUbuntu Pro 做為作業系統映像檔,因為這兩者都支援 UIO 和不含 IOMMU 的 VFIO 驅動程式的套件管理員。如果不想指定任何作業系統,建議指定 Debian 11 以上版本,以加快封包處理速度。

控制台

建立 VM,使用您在先前步驟中建立的兩個虛擬私有雲網路子網路,方法如下:

  1. 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。

    前往 VM 執行個體

    「VM instances」(VM 執行個體) 頁面隨即開啟。

  2. 按一下「建立執行個體」

    「Create an instance」(建立執行個體) 頁面會隨即開啟。

  3. 在「Name」(名稱) 欄位,輸入 VM 的名稱。

  4. 在「Region」(區域) 選單中,選取您在先前步驟中建立網路的相同區域。

  5. 在「Zone」(可用區) 選單中,選取 VM 的可用區。

  6. 在「機器設定」專區中,執行下列操作:

    1. 選取下列選項之一:

      • 如為一般工作負載,請選取「一般用途」分頁標籤 (預設)。

      • 如要處理需要大量運算資源的工作負載,請選取「運算最佳化」分頁標籤。

      • 如要處理記憶體/vCPU 比率較高的工作負載,請選取「記憶體最佳化」分頁標籤。

      • 如要查看使用圖形處理器 (GPU) 的工作負載,請選取「GPU」分頁標籤。

    2. (選用步驟) 如果您在上一個步驟中指定 GPU,且想要變更要連結至 VM 的 GPU,請執行下列一或多項操作:

      1. 在「GPU type」(GPU 類型) 選單中,選取 GPU 類型。

      2. 在「Number of GPUs」(GPU 數量) 選單中,選取 GPU 數量。

    3. 在「系列」選單中,選取機器系列。

    4. 在「Machine type」(機器類型) 選單中,選取機器類型。

    5. 選用:展開「進階設定」,然後按照提示進一步自訂這個 VM 的機器。

  7. 選用:在「Boot disk」(開機磁碟) 區段中,按一下「Change」(變更),然後按照提示變更磁碟映像檔。

  8. 展開「Advanced options」(進階選項) 區段。

  9. 展開「Networking」(網路) 區段。

  10. 在「網路效能設定」部分,執行下列操作:

    1. 在「網路介面卡」選單中,選取下列其中一個選項:

      • 如要使用 gVNIC,請選取「gVNIC」gVNIC

      • 如要使用 VirtIO-Net,請選取「VirtIO」VirtIO

    2. 選用步驟:如要提升網路效能並縮短延遲時間,請勾選「啟用 Tier_1 網路」核取方塊。

  11. 在「Network interfaces」(網路介面) 區段中,執行下列操作:

    1. 在「default」列中,按一下 「Delete item "default"」(刪除「default」項目)

    2. 按一下「新增網路介面」

      系統會顯示「New network interface」(新增網路介面) 區段。

    3. 在「Network」(網路) 選單中,選取您在先前步驟中建立的控制層網路。

    4. 按一下 [完成]

    5. 再次按一下「新增網路介面」

      系統會顯示「New network interface」(新增網路介面) 區段。

    6. 在「Network」(網路) 選單中,選取您在先前步驟中建立的資料平面網路。

    7. 按一下 [完成]

  12. 點選「建立」

    「VM instances」(VM 執行個體) 頁面隨即開啟。建立 VM 最多可能需要一分鐘。

gcloud

使用 gcloud compute instances create 指令搭配下列旗標,建立使用您在上一個步驟中建立的兩個虛擬私有雲網路子網路的 VM:

gcloud compute instances create VM_NAME \
    --image-family=IMAGE_FAMILY \
    --image-project=IMAGE_PROJECT \
    --machine-type=MACHINE_TYPE  \
    --network-interface=network=CONTROL_PLANE_NETWORK_NAME,subnet=CONTROL_PLANE_SUBNET_NAME,nic-type=VNIC_TYPE \
    --network-interface=network=DATA_PLANE_NETWORK_NAME,subnet=DATA_PLANE_SUBNET_NAME,nic-type=VNIC_TYPE \
    --zone=ZONE

更改下列內容:

  • VM_NAME:VM 名稱。

  • IMAGE_FAMILY:用來初始化開機磁碟的作業系統映像檔系列。或者,您也可以指定 --image=IMAGE 旗標,並將 IMAGE 換成特定版本的映像檔。瞭解如何查看 Compute Engine 映像檔專案中的可用映像檔清單

  • IMAGE_PROJECT:包含磁碟映像檔的映像檔專案名稱。

  • MACHINE_TYPE:VM 的機器類型,可以是預先定義自訂類型。

  • VNIC_TYPE:用於控制層和資料層網路的 vNIC 類型。這個值必須是下列其中一個:

    • 如要使用 gVNIC,請指定 GVNIC

    • 如要使用 VirtIO-Net,請指定 VIRTIO_NET

  • CONTROL_PLANE_NETWORK_NAME:您在前幾個步驟中建立的控制平面網路名稱。

  • CONTROL_PLANE_SUBNET_NAME:您在前幾個步驟中建立的控制平面網路子網路名稱。

  • DATA_PLANE_NETWORK_NAME:您在上一個步驟中建立的資料平面網路名稱。

  • DATA_PLANE_SUBNET_NAME:您在上一個步驟中自動建立的控制平面網路子網路名稱。

  • ZONE:要在哪個可用區建立 VM。在您於前一個步驟建立子網路的相同區域中,指定一個可用區。

舉例來說,如要在 us-central1-a 區域中建立名為 dpdk-vm 的 VM,並指定 512 GB 的 SSD 永久磁碟、具有 60 個 vCPU 的預先定義 C2 機器類型、Tier_1 網路,以及同時使用 gVNIC 的資料層和控制層網路,請執行下列指令:

gcloud compute instances create dpdk-vm \
    --boot-disk-size=512GB \
    --boot-disk-type=pd-ssd \
    --image-project=ubuntu-os-cloud \
    --image-family=ubuntu-2004-lts \
    --machine-type=c2-standard-60 \
    --network-performance-configs=total-egress-bandwidth-tier=TIER_1 \
    --network-interface=network=control,subnet=control,nic-type=GVNIC \
    --network-interface=network=data,subnet=data,nic-type=GVNIC \
    --zone=us-central1-a

API

instances.insert 方法發出 POST 要求,並填入下列欄位,即可建立使用您在先前步驟中建立的兩個虛擬私有雲網路子網路的 VM:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

{
  "name": "VM_NAME",
  "machineType": "MACHINE_TYPE",
  "disks": [
    {
      "initializeParams": {
        "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE_FAMILY"
      }
    }
  ],
  "networkInterfaces": [
    {
      "network": "global/networks/CONTROL_PLANE_NETWORK_NAME",
      "subnetwork": "regions/REGION/subnetworks/CONTROL_PLANE_SUBNET_NAME",
      "nicType": "VNIC_TYPE"
    },
    {
      "network": "global/networks/DATAPLANE_NETWORK_NAME",
      "subnetwork": "regions/REGION/subnetworks/DATA_PLANE_SUBNET_NAME",
      "nicType": "VNIC_TYPE"
    }
  ]
}

更改下列內容:

  • PROJECT_ID:控制平面 VPC 網路和資料平面 VPC 網路所在的專案 ID。

  • ZONE:要在哪個可用區建立 VM。

  • VM_NAME:VM 名稱。

  • MACHINE_TYPE:VM 的機器類型,可以是預先定義自訂類型。

  • IMAGE_PROJECT:包含磁碟映像檔的映像檔專案名稱。

  • IMAGE_FAMILY:用來初始化開機磁碟的作業系統映像檔系列。您也可以指定特定版本的映像檔。瞭解如何查看 Compute Engine 映像檔專案中的映像檔清單

  • CONTROL_PLANE_NETWORK_NAME:您在前幾個步驟中建立的控制平面網路名稱。

  • REGION:控制層和資料層網路的子網路所在區域。

  • CONTROL_PLANE_SUBNET_NAME:您在前幾個步驟中建立的控制平面網路子網路名稱。

  • VNIC_TYPE:用於控制層和資料層網路的 vNIC 類型。這個值必須是下列其中一個:

    • 如要使用 gVNIC,請指定 GVNIC

    • 如要使用 VirtIO-Net,請指定 VIRTIO_NET

  • DATA_PLANE_NETWORK_NAME:您在上一個步驟中建立的資料平面網路名稱。

  • DATA_PLANE_SUBNET_NAME:您在前幾個步驟中建立的控制平面網路子網路名稱。

舉例來說,如要在 us-central1-a 區域中建立名為 dpdk-vm 的 VM,並指定 512 GB 的 SSD 永久磁碟、具有 60 個 vCPU 的預先定義 C2 機器類型、Tier_1 網路,以及同時使用 gVNIC 的資料層和控制層網路,請發出下列 POST 要求:

POST https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-central1-a/instances

{
  "name": "dpdk-vm",
  "machineType": "c2-standard-60",
  "disks": [
    {
      "initializeParams": {
        "diskSizeGb": "512GB",
        "diskType": "pd-ssd",
        "sourceImage": "projects/ubuntu-os-cloud/global/images/ubuntu-2004-lts"
      },
      "boot": true
    }
  ],
  "networkInterfaces": [
    {
      "network": "global/networks/control",
      "subnetwork": "regions/us-central1/subnetworks/control",
      "nicType": "GVNIC"
    },
    {
      "network": "global/networks/data",
      "subnetwork": "regions/us-central1/subnetworks/data",
      "nicType": "GVNIC"
    }
  ],
  "networkPerformanceConfig": {
    "totalEgressBandwidthTier": "TIER_1"
  }
}

如要進一步瞭解建立 VM 時的設定選項,請參閱「建立及啟動 VM 執行個體」。

在 VM 上安裝 DPDK

如要在 VM 上安裝 DPDK,請按照下列步驟操作:

  1. 使用 SSH 連線至上一節建立的 VM。

  2. 設定 DPDK 安裝作業的依附元件:

    sudo apt-get update && sudo apt-get upgrade -yq
    sudo apt-get install -yq build-essential ninja-build python3-pip \
        linux-headers-$(uname -r) pkg-config libnuma-dev
    sudo pip install pyelftools meson
    
  3. 安裝 DPDK:

    wget https://fast.dpdk.org/rel/dpdk-23.07.tar.xz
    tar xvf dpdk-23.07.tar.xz
    cd dpdk-23.07
    
  4. 如要使用範例建構 DPDK,請執行下列操作:

    meson setup -Dexamples=all build
    sudo ninja -C build install; sudo ldconfig
    

安裝驅動程式

如要準備在驅動程式上執行 DPDK,請選用下列其中一種方法安裝驅動程式:

安裝不含 IOMMU 的 VFIO

如要安裝不含 IOMMU 的 VFIO 驅動程式,請按照下列步驟操作:

  1. 檢查 VFIO 是否已啟用:

    cat /boot/config-$(uname -r) | grep NOIOMMU
    

    如果 VFIO 未啟用,請按照「安裝 UIO」一文中的步驟操作。

  2. 在 VFIO 中啟用「No-IOMMU mode」(無 IOMMU 模式):

    sudo bash -c 'echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode'
    

安裝 UIO

如要在 DPDK 上安裝 UIO 驅動程式,請選取下列其中一種方法:

使用 Git 安裝 UIO

如要使用 git 在 DPDK 上安裝 UIO 驅動程式,請按照下列步驟操作:

  1. igb_uio git 存放區複製到 VM 的磁碟:

    git clone https://dpdk.org/git/dpdk-kmods
    
  2. 從複製的 Git 存放區的父項目錄中,建構模組並在 DPDK 上安裝 UIO 驅動程式:

    pushd dpdk-kmods/linux/igb_uio
    sudo make
    sudo depmod && sudo insmod igb_uio.ko
    popd
    

使用 Linux 套件安裝 UIO

如要使用 Linux 套件在 DPDK 上安裝 UIO 驅動程式,請按照下列步驟操作:

  1. 安裝 dpdk-igb-uio-dkms 套件

    sudo apt-get install -y dpdk-igb-uio-dkms
    
  2. 在 DPDK 上安裝 UIO 驅動程式:

    sudo modprobe igb_uio
    

將 DPDK 繫結至驅動程式並進行測試

如要將 DPDK 繫結至上一節安裝的驅動程式,請按照下列步驟操作:

  1. 取得目前網路介面的周邊元件互連 (PCI) 插槽編號:

    sudo lspci | grep -e "gVNIC" -e "Virtio network device"
    

    舉例來說,如果 VM 使用 ens4 做為網路介面,PCI 插槽編號就是 00:04.0

  2. 停止連線至網路介面的網路介面卡:

    sudo ip link set NETWORK_INTERFACE_NAME down
    

    NETWORK_INTERFACE_NAME 替換為虛擬私有雲網路中指定的網路介面名稱。如要查看 VM 使用的網路介面,請查看網路介面的設定:

    sudo ifconfig
    
  3. 將 DPDK 繫結至驅動程式:

    sudo dpdk-devbind.py --bind=DRIVER PCI_SLOT_NUMBER
    

    更改下列內容:

    • DRIVER:要繫結 DPDK 的驅動程式。請指定下列其中一個值:

      • UIO 驅動程式:igb_uio

      • 不含 IOMMU 的 VFIO 驅動程式:vfio-pci

    • PCI_SLOT_NUMBER:目前網路介面的 PCI 插槽編號,格式為 00:0NUMBER.0

  4. 建立 /mnt/huge 目錄,然後為 DPDK 建立一些巨頁,供緩衝區使用:

    sudo mkdir /mnt/huge
    sudo mount -t hugetlbfs -o pagesize=1G none /mnt/huge
    sudo bash -c 'echo 4 > /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages'
    sudo bash -c 'echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages'
    
  5. 執行 DPDK 程式庫隨附的 testpmd 範例應用程式,測試 DPDK 是否能使用您在先前步驟中建立的網路介面:

    sudo ./build/app/dpdk-testpmd
    

    如要進一步瞭解如何測試 DPDK,請參閱「Testpmd 指令列選項」。

解除繫結 DPDK

使用 DPDK 後,您可以從先前章節安裝的驅動程式取消繫結。如要取消繫結 DPDK,請按照下列步驟操作:

  1. 從驅動程式解除繫結 DPDK:

    sudo dpdk-devbind.py -u PCI_SLOT_NUMBER
    

    PCI_SLOT_NUMBER 替換為您在先前步驟中指定的 PCI 插槽編號。如要驗證目前網路介面的 PCI 插槽編號,請按照下列步驟操作:

    sudo lspci | grep -e "gVNIC" -e "Virtio network device"
    

    舉例來說,如果 VM 使用 ens4 做為網路介面,PCI 插槽編號就是 00:04.0

  2. 重新載入 Compute Engine 網路驅動程式:

    sudo bash -c 'echo PCI_SLOT_NUMBER > /sys/bus/pci/drivers/VNIC_DIRECTORY/bind'
    sudo ip link set NETWORK_INTERFACE_NAME up
    

    更改下列內容:

    • PCI_SLOT_NUMBER:您在先前步驟中指定的 PCI 插槽編號。

    • VNIC_DIRECTORY:vNIC 的目錄。根據您使用的 vNIC 類型,指定下列其中一個值:

      • gVNIC:gvnic

      • VirtIO-Net:virtio-pci

    • NETWORK_INTERFACE_NAME:您在上一節中指定的網路介面名稱。

後續步驟