使用 DPDK 加快网络数据包处理速度


本文档介绍了如何在虚拟机 (VM) 实例上启用数据平面开发套件 (DPDK),以加快网络数据包处理速度。

DPDK 是一个框架,适用于需要快速数据包处理、低延迟和一致性能的高性能应用。DPDK 提供了一组数据平面库和一个网络接口控制器 (NIC),可绕过内核网络并直接在用户空间中运行。例如,在运行以下操作时,在虚拟机上启用 DPDK 非常有用:

  • 网络功能虚拟化 (NFV) 部署

  • 软件定义网络 (SDN) 应用

  • 视频在线播放或 IP 语音应用

您可以使用以下任一虚拟 NIC (vNIC) 类型在虚拟机上运行 DPDK:

  • 推荐:gVNIC

    一种专为 Compute Engine 设计的高性能、安全且可扩缩的虚拟网络接口,是接替 virtIO 的下一代 vNIC。

  • VirtIO-Net

    一个开源以太网驱动程序,可让虚拟机高效访问物理硬件,例如块存储和网络适配器。

在虚拟环境(而不是在物理硬件上)运行 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. Install the Google Cloud CLI, then initialize it by running the following command:

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

      如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证

使用要求

创建用于运行 DPDK 的虚拟机时,请确保满足以下条件:

  • 为避免在运行应用时出现网络连接问题,请使用两个虚拟私有云网络:

    • 控制平面的 VPC 网络

    • 控制平面的 VPC 网络

  • 这两个 VPC 网络都必须指定以下各项:

    • 具有唯一 IP 地址范围的子网

    • 子网的区域相同

    • 同一类型的 VNIC(gVNIC 或 VirtIO-Net)

  • 创建虚拟机时:

    • 您必须指定与两个 VPC 网络的子网相同的区域。

    • 您必须指定要与 DPDK 搭配使用的 vNIC 类型。

    • 您必须为 gVNIC 或 VirtIO-Net 指定支持的机器系列

限制

在虚拟机上运行 DPDK 存在以下限制:

配置虚拟机以运行 DPDK

本部分介绍了如何创建用于运行 DPDK 的虚拟机。

创建 VPC 网络

使用 Google Cloud 控制台、Google Cloud CLI 或 Compute Engine API 为数据平面和控制平面创建两个 VPC 网络。您可以稍后在创建虚拟机时指定这些网络。

控制台

  1. 为数据平面创建 VPC 网络:

    1. 在 Google Cloud 控制台中,转到 VPC 网络

      进入 VPC 网络页面

      系统会打开 VPC 网络页面。

    2. 点击 创建 VPC 网络

      系统会打开创建 VPC 网络页面。

    3. 名称字段中,为网络输入名称。

    4. 新子网部分中,执行以下操作:

      1. 名称字段中,为子网输入名称。

      2. 区域菜单中,为子网选择区域。

      3. 选择 IPv4(单栈)(默认)。

      4. IPv4 范围中,输入有效 IPv4 范围地址(采用 CIDR 表示法)。

      5. 点击完成

    5. 点击创建

      系统会打开 VPC 网络页面。VPC 网络创建过程最多可能需要一分钟才能完成。

  2. 使用防火墙规则为控制平面创建 VPC 网络,以允许通过 SSH 连接到虚拟机:

    1. 再次点击 创建 VPC 网络

      系统会打开创建 VPC 网络页面。

    2. 名称字段中,为网络输入名称。

    3. 新子网部分中,执行以下操作:

      1. 名称字段中,输入子网的名称。

      2. 区域菜单中,选择您为数据平面网络的子网指定的区域。

      3. 选择 IPv4(单栈)(默认)。

      4. IPv4 范围中,输入有效 IPv4 范围地址(采用 CIDR 表示法)。

      5. 点击完成

    4. IPv4 防火墙规则标签页中,选中 NETWORK_NAME-allow-ssh 复选框。

      其中,NETWORK_NAME 是您在前面的步骤中指定的网络名称。

    5. 点击创建

      系统会打开 VPC 网络页面。VPC 网络创建过程最多可能需要一分钟才能完成。

gcloud

  1. 如需为数据平面创建 VPC 网络,请按照以下步骤操作:

    1. 使用 gcloud compute networks create 命令并将 --subnet-mode 标志设置为 custom,创建具有手动创建的子网的 VPC 网络。

      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 命令为您刚刚创建的 VPC 数据平面网络创建子网。

      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:子网的有效 IPv4 范围(采用 CIDR 表示法)。

      • REGION:要在其中创建子网的区域。

  2. 如需创建具有防火墙规则以允许通过 SSH 连接到虚拟机的控制平面的 VPC 网络,请执行以下步骤:

    1. 使用 gcloud compute networks create 命令并将 --subnet-mode 标志设置为 custom,创建具有手动创建的子网的 VPC 网络。

      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 命令为您刚刚创建的 VPC 控制平面网络创建子网。

      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:子网的有效 IPv4 范围(采用 CIDR 表示法)。

      • REGION:要在其中创建子网的区域,该区域必须与您在数据平面网络的子网中指定的区域匹配。

    3. 使用 gcloud compute firewall-rules create 命令并将 --allow 标志设置为 tcp:22,创建允许 SSH 连接到控制平面网络的 VPC 防火墙规则。

      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. 如需为数据平面创建 VPC 网络,请按照以下步骤操作:

    1. 使用手动创建的子网创建 VPC 网络,方法是:通过向 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 请求,为 VPC 数据平面网络创建子网。

      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 连接到虚拟机的控制平面的 VPC 网络,请按照以下步骤操作:

    1. 使用手动创建的子网创建 VPC 网络,方法是:通过向 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 请求,为 VPC 数据控制网络创建子网。

      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 连接到控制平面网络的 VPC 防火墙规则。在请求中,将 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:您在前面的步骤中创建的控制平面网络的名称。

如需了解创建 VPC 网络时的更多配置选项,请参阅创建和管理 VPC 网络

创建将 VPC 网络用于 DPDK 的虚拟机

创建一个虚拟机,以在您之前使用 Google Cloud 控制台、gcloud CLI 和 Compute Engine API 创建的两个 VPC 网络上启用 gVNIC 或 virtIO-Net。

推荐:将 Ubuntu LTSUbuntu Pro 指定为操作系统映像,因为它们的软件包管理器支持 UIO 和无 IOMMU VFIO 驱动程序。如果您不想指定任何这些操作系统,建议指定 Debian 11 或更高版本,以加快数据包处理速度。

控制台

通过执行以下操作,创建一个使用您在前面步骤中创建的两个 VPC 网络子网的虚拟机:

  1. 在 Google Cloud 控制台中,浏览到虚拟机实例

    进入“虚拟机实例”

    系统会打开虚拟机实例页面。

  2. 点击 创建实例

    系统随即会打开创建实例页面。

  3. 名称字段中,为虚拟机输入名称。

  4. 区域菜单中,选择您在前面的步骤中创建网络所在的区域。

  5. 可用区菜单中,为虚拟机选择一个可用区。

  6. 机器配置部分中,执行以下操作:

    1. 从下列选项中选择一项:

      • 对于常见工作负载,请选择通用标签页(默认)。

      • 对于需要高性能的工作负载,请选择计算优化标签页。

      • 对于内存与 vCPU 比率较高的工作负载,请选择内存优化标签页。

      • 对于使用图形处理单元 (GPU) 的工作负载,请选择 GPU 标签页。

    2. 可选。如果您在上一步中指定了 GPU,并且想要更改 GPU 以挂接到虚拟机,请执行以下操作中的一项或多项:

      1. GPU 类型菜单中,选择 GPU 的类型。

      2. GPU 数量菜单中,选择 GPU 的数量。

    3. 系列菜单中,选择一个机器系列。

    4. 机器类型菜单中,选择一种机器类型。

    5. 可选:展开高级配置,然后按照提示进一步自定义此虚拟机的机器。

  7. 可选:在启动磁盘部分,点击更改,然后按照提示更改磁盘映像。

  8. 展开高级选项部分。

  9. 展开网络部分。

  10. 网络性能配置部分中,执行以下操作:

    1. 网络接口卡菜单中,选择以下选项之一:

      • 如需使用 gVNIC,请选择 gVNIC

      • 如需使用 VirtIO-Net,请选择 VirtIO

    2. 可选:如需提高网络性能并缩短延迟时间,请选中 Enable Tier_1 networking 复选框。

  11. 网络接口部分中,执行以下操作:

    1. 在“默认”行中,依次点击 删除“默认”项

    2. 点击添加网络接口

      随即会出现新建网络接口部分。

    3. 网络菜单中,选择您在前面的步骤中创建的控制平面网络。

    4. 点击完成

    5. 再次点击添加网络接口

      随即会出现新建网络接口部分。

    6. 网络菜单中,选择您在前面步骤中创建的数据平面网络。

    7. 点击完成

  12. 点击创建

    系统会打开虚拟机实例页面。虚拟机创建过程最多可能需要一分钟才能完成。

gcloud

通过将 gcloud compute instances create 命令与以下标志结合使用,创建一个使用您在前面步骤中创建的两个 VPC 网络子网的虚拟机:

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:虚拟机的名称。

  • IMAGE_FAMILY:启动磁盘使用其初始化的操作系统的映像系列。或者,您可以指定 --image=IMAGE 标志,并将 IMAGE 替换为映像的特定版本。了解如何查看 Compute Engine 映像项目中可用的映像列表

  • IMAGE_PROJECT:包含磁盘映像的映像项目的名称。

  • MACHINE_TYPE:虚拟机的预定义自定义机器类型。

  • 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:要在其中创建虚拟机的可用区。指定您在前面的步骤中创建的子网所在区域中的可用区。

例如,如需在 us-central1-a 可用区中创建一个名为 dpdk-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 请求,以创建使用您在前面步骤中创建的两个 VPC 网络子网的虚拟机:

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_NAME:虚拟机的名称。

  • MACHINE_TYPE:虚拟机的预定义自定义机器类型。

  • 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 的虚拟机,以指定 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"
  }
}

如需了解创建虚拟机时的更多配置选项,请参阅创建和启动虚拟机实例

在虚拟机上安装 DPDK

如需在虚拟机上安装 DPDK,请按以下步骤操作:

  1. 使用 SSH 连接到您在上一部分中创建的虚拟机。

  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 模式

    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 代码库克隆到虚拟机中的磁盘:

    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"
    

    例如,如果虚拟机使用 ens4 作为网络接口,则 PCI 插槽编号为 00:04.0

  2. 停止连接到网络适配器的网络接口:

    sudo ip link set NETWORK_INTERFACE_NAME down
    

    NETWORK_INTERFACE_NAME 替换为 VPC 网络中指定的网络接口的名称。如需查看虚拟机正在使用哪个网络接口,请查看网络接口的配置:

    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"
    

    例如,如果虚拟机使用 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:您在上一部分中指定的网络接口的名称。

后续步骤