8.6. 在 SR-IOV 中使用 DPDK


Data Plane Development Kit (DPDK) 提供了一组库和驱动程序,用于快速数据包处理。

您可以配置集群和虚拟机(VM),以通过 SR-IOV 网络运行 DPDK 工作负载。

8.6.1. 为 DPDK 工作负载配置集群

您可以配置 OpenShift Container Platform 集群来运行 Data Plane Development Kit (DPDK) 工作负载,以提高网络性能。

先决条件

  • 您可以使用具有 cluster-admin 权限的用户访问集群。
  • 已安装 OpenShift CLI(oc)。
  • 已安装 SR-IOV Network Operator。
  • 已安装 Node Tuning Operator。

流程

  1. 映射计算节点拓扑,以确定为 DPDK 应用程序隔离哪些非统一内存访问 (NUMA) CPU,以及为操作系统 (OS) 保留哪些非一致性内存访问 (NUMA) CPU。
  2. 使用自定义角色标记计算节点的子集,例如 worker-dpdk

    $ oc label node <node_name> node-role.kubernetes.io/worker-dpdk=""
  3. 创建一个新的 MachineConfigPool 清单,其中包含 spec.machineConfigSelector 对象中的 worker-dpdk 标签:

    MachineConfigPool 清单示例

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfigPool
    metadata:
      name: worker-dpdk
      labels:
        machineconfiguration.openshift.io/role: worker-dpdk
    spec:
      machineConfigSelector:
        matchExpressions:
          - key: machineconfiguration.openshift.io/role
            operator: In
            values:
              - worker
              - worker-dpdk
      nodeSelector:
        matchLabels:
          node-role.kubernetes.io/worker-dpdk: ""

  4. 创建一个 PerformanceProfile 清单,它应用到标记的节点以及您在上一步中创建的机器配置池。性能配置集指定为 DPDK 应用程序隔离的 CPU,以及用于保留保留而保留的 CPU。

    PerformanceProfile 清单示例

    apiVersion: performance.openshift.io/v2
    kind: PerformanceProfile
    metadata:
      name: profile-1
    spec:
      cpu:
        isolated: 4-39,44-79
        reserved: 0-3,40-43
      globallyDisableIrqLoadBalancing: true
      hugepages:
        defaultHugepagesSize: 1G
        pages:
        - count: 8
          node: 0
          size: 1G
      net:
        userLevelNetworking: true
      nodeSelector:
        node-role.kubernetes.io/worker-dpdk: ""
      numa:
        topologyPolicy: single-numa-node

    注意

    应用 MachineConfigPoolPerformanceProfile 清单后,计算节点会自动重启。

  5. PerformanceProfile 对象的 status.runtimeClass 字段检索生成的 RuntimeClass 资源的名称:

    $ oc get performanceprofiles.performance.openshift.io profile-1 -o=jsonpath='{.status.runtimeClass}{"\n"}'
  6. 通过编辑 HyperConverged 自定义资源 (CR) 将之前获取的 RuntimeClass 名称设置为 virt-launcher pod 的默认容器运行时类:

    $ oc patch hyperconverged kubevirt-hyperconverged -n openshift-cnv \
        --type='json' -p='[{"op": "add", "path": "/spec/defaultRuntimeClass", "value":"<runtimeclass-name>"}]'
    注意

    编辑 HyperConverged CR 会更改影响更改后创建的所有虚拟机的全局设置。

  7. 如果您的启用 DPDK 的计算节点使用 Simultaneous 多线程 (SMT),请通过编辑 HyperConverged CR 来启用 AlignCPUs enabler:

    $ oc patch hyperconverged kubevirt-hyperconverged -n openshift-cnv \
        --type='json' -p='[{"op": "replace", "path": "/spec/featureGates/alignCPUs", "value": true}]'
    注意

    启用 AlignCPU 可让 OpenShift Virtualization 请求两个额外的专用 CPU,在使用仿真程序线程隔离时将 CPU 总数引入到甚至奇偶校验。

  8. 创建一个 SriovNetworkNodePolicy 对象,并将 spec.deviceType 字段设置为 vfio-pci

    SriovNetworkNodePolicy 清单示例

    apiVersion: sriovnetwork.openshift.io/v1
    kind: SriovNetworkNodePolicy
    metadata:
      name: policy-1
      namespace: openshift-sriov-network-operator
    spec:
      resourceName: intel_nics_dpdk
      deviceType: vfio-pci
      mtu: 9000
      numVfs: 4
      priority: 99
      nicSelector:
        vendor: "8086"
        deviceID: "1572"
        pfNames:
          - eno3
        rootDevices:
          - "0000:19:00.2"
      nodeSelector:
        feature.node.kubernetes.io/network-sriov.capable: "true"

8.6.2. 为 DPDK 工作负载配置项目

您可以将项目配置为在 SR-IOV 硬件中运行 DPDK 工作负载。

先决条件

  • 集群被配置为运行 DPDK 工作负载。

流程

  1. 为您的 DPDK 应用程序创建一个命名空间:

    $ oc create ns dpdk-checkup-ns
  2. 创建一个 SriovNetwork 对象来引用 SriovNetworkNodePolicy 对象。创建 SriovNetwork 对象时,SR-IOV Network Operator 会自动创建一个 NetworkAttachmentDefinition 对象。

    SriovNetwork 清单示例

    apiVersion: sriovnetwork.openshift.io/v1
    kind: SriovNetwork
    metadata:
      name: dpdk-sriovnetwork
      namespace: openshift-sriov-network-operator
    spec:
      ipam: |
        {
          "type": "host-local",
          "subnet": "10.56.217.0/24",
          "rangeStart": "10.56.217.171",
          "rangeEnd": "10.56.217.181",
          "routes": [{
            "dst": "0.0.0.0/0"
          }],
          "gateway": "10.56.217.1"
        }
      networkNamespace: dpdk-checkup-ns 1
      resourceName: intel_nics_dpdk 2
      spoofChk: "off"
      trust: "on"
      vlan: 1019

    1
    部署 NetworkAttachmentDefinition 对象的命名空间。
    2
    为 DPDK 工作负载配置集群时创建的 SriovNetworkNodePolicy 对象的 spec.resourceName 属性的值。
  3. 可选:运行虚拟机延迟检查以验证网络是否已正确配置。
  4. 可选:运行 DPDK 检查,以验证命名空间是否已准备好 DPDK 工作负载。

8.6.3. 为 DPDK 工作负载配置虚拟机

您可以在虚拟机 (VM) 上运行 Data Packet Development Kit (DPDK) 工作负载,以实现较低延迟和更高的吞吐量,以便在用户空间中更快地处理数据包。DPDK 使用 SR-IOV 网络进行基于硬件的 I/O 共享。

先决条件

  • 集群被配置为运行 DPDK 工作负载。
  • 您已创建并配置了运行虚拟机的项目。

流程

  1. 编辑 VirtualMachine 清单,使其包含 SR-IOV 网络接口、CPU 拓扑、CRI-O 注解和巨页的信息:

    VirtualMachine 清单示例

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: rhel-dpdk-vm
    spec:
      running: true
      template:
        metadata:
          annotations:
            cpu-load-balancing.crio.io: disable 1
            cpu-quota.crio.io: disable 2
            irq-load-balancing.crio.io: disable 3
        spec:
          domain:
            cpu:
              sockets: 1 4
              cores: 5 5
              threads: 2
              dedicatedCpuPlacement: true
              isolateEmulatorThread: true
            interfaces:
              - masquerade: {}
                name: default
              - model: virtio
                name: nic-east
                pciAddress: '0000:07:00.0'
                sriov: {}
              networkInterfaceMultiqueue: true
              rng: {}
          memory:
            hugepages:
              pageSize: 1Gi 6
              guest: 8Gi
          networks:
            - name: default
              pod: {}
            - multus:
                networkName: dpdk-net 7
              name: nic-east
    # ...

    1
    此注解指定为容器使用的 CPU 禁用负载均衡。
    2
    此注解指定容器使用的 CPU 配额被禁用。
    3
    此注解指定,容器使用的 CPU 禁用中断请求 (IRQ) 负载均衡。
    4
    虚拟机中的插槽数。此字段必须设置为 1,才能从相同的 Non-Uniform Memory Access (NUMA) 节点调度 CPU。
    5
    虚拟机中的内核数。这必须大于或等于 1。在本例中,虚拟机被调度有 5 个超线程或 10 个 CPU。
    6
    巨页的大小。x86-64 构架的可能值为 1Gi 和 2Mi。在这个示例中,请求大小为 1Gi 的 8 个巨页。
    7
    SR-IOV NetworkAttachmentDefinition 对象的名称。
  2. 保存并退出编辑器。
  3. 应用 VirtualMachine 清单:

    $ oc apply -f <file_name>.yaml
  4. 配置客户机操作系统。以下示例显示了 RHEL 8 OS 的配置步骤:

    1. 使用 GRUB 引导装载程序命令行界面配置巨页。在以下示例中,指定了 8 个 1G 巨页。

      $ grubby --update-kernel=ALL --args="default_hugepagesz=1GB hugepagesz=1G hugepages=8"
    2. 要使用 TuneD 应用程序中的 cpu-partitioning 配置集来实现低延迟性能优化,请运行以下命令:

      $ dnf install -y tuned-profiles-cpu-partitioning
      $ echo isolated_cores=2-9 > /etc/tuned/cpu-partitioning-variables.conf

      前两个 CPU (0 和 1) 被设置,用于保存任务,其余则隔离 DPDK 应用程序。

      $ tuned-adm profile cpu-partitioning
    3. 使用 driverctl 设备驱动程序控制工具覆盖 SR-IOV NIC 驱动程序:

      $ dnf install -y driverctl
      $ driverctl set-override 0000:07:00.0 vfio-pci
  5. 重启虚拟机以应用更改。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.