使用 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 进行身份验证。

    选择标签页以了解您打算如何使用本页面上的示例:

    控制台

    当您使用 Google Cloud 控制台访问 Google Cloud 服务和 API 时,无需设置身份验证。

    gcloud

    1. 安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init
    2. 设置默认区域和可用区

    REST

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

      安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init

使用要求

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

  • 为避免在运行应用时缺少网络连接,请使用两个 Virtual Private Cloud 网络:

    • 控制平面的 VPC 网络

    • 数据平面的 VPC 网络

  • 这两个 VPC 网络必须指定以下内容:

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

    • 子网的区域相同

    • 相同类型的 VNIC - gVNIC 或 VirtIO-Net

  • 创建虚拟机时:

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

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

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

限制

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

  • 您只能将单栈子网用于虚拟机中使用的两个 VPC 网络。

  • 如果您将 gVNIC 用作两个 VPC 网络的 vNIC 类型,请确保满足以下条件:

  • 如果要在创建虚拟机时启用每个虚拟机 Tier_1 网络性能以实现更高的网络性能,您必须指定以下内容:

配置虚拟机以运行 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 范围中,以 CIDR 表示法输入有效的 IPv4 范围地址。

      5. 点击完成

    5. 点击创建

      VPC 网络页面随即打开。VPC 网络创建完成可能需要一分钟时间。

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

    1. 再次点击 创建 VPC 网络

      此时会打开创建 VPC 网络页面。

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

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

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

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

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

      4. IPv4 范围中,以 CIDR 表示法输入有效的 IPv4 范围地址。

      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. 可选:如需提高网络性能并减少延迟时间,请选中启用 Tier_1 网络复选框。

  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:您在上一部分中指定的网络接口的名称。

后续步骤