使用 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. 安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

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

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

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

        gcloud init

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

使用要求

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

后续步骤