×

数据平面开发套件 (DPDK) 提供了一套用于快速数据包处理的库和驱动程序。

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

为 DPDK 工作负载配置集群

您可以配置 OpenShift Container Platform 集群以运行数据平面开发套件 (DPDK) 工作负载,以提高网络性能。

先决条件
  • 您可以以具有 `cluster-admin` 权限的用户身份访问集群。

  • 您已安装 OpenShift CLI (`oc`)。

  • 您已安装 SR-IOV 网络运算符。

  • 您已安装节点调整运算符。

步骤
  1. 映射您的计算节点拓扑以确定哪些非一致性内存访问 (NUMA) CPU 专门用于 DPDK 应用程序,哪些 CPU 保留用于操作系统 (OS)。

  2. 如果您的 OpenShift Container Platform 集群使用单独的控制平面和计算节点以实现高可用性

    1. 使用自定义角色标记计算节点的子集;例如,`worker-dpdk`

      $ oc label node <node_name> node-role.kubernetes.io/worker-dpdk=""
    2. 创建一个新的 `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: ""
  3. 创建一个 `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

    应用 `MachineConfigPool` 和 `PerformanceProfile` 清单后,计算节点会自动重新启动。

  4. 从 `PerformanceProfile` 对象的 `status.runtimeClass` 字段中检索生成的 `RuntimeClass` 资源的名称

    $ oc get performanceprofiles.performance.openshift.io profile-1 -o=jsonpath='{.status.runtimeClass}{"\n"}'
  5. 通过编辑 `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 会更改全局设置,该设置会影响应用更改后创建的所有虚拟机。

  6. 如果您的支持 DPDK 的计算节点使用同时多线程 (SMT),请通过编辑 `HyperConverged` CR 来启用 `AlignCPUs` 启用程序

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

    启用 `AlignCPUs` 允许 OpenShift Virtualization 请求最多两个额外的专用 CPU,以便在使用仿真器线程隔离时将总 CPU 计数提高到偶数。

  7. 创建一个 `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"

删除高可用性集群的自定义机器配置池

您可以删除之前为高可用性集群创建的自定义机器配置池。

先决条件
  • 您可以以具有 `cluster-admin` 权限的用户身份访问集群。

  • 您已安装 OpenShift CLI (`oc`)。

  • 您已通过使用自定义角色标记计算节点的子集并创建包含该标签的 `MachineConfigPool` 清单来创建自定义机器配置池。

步骤
  1. 通过运行以下命令从计算节点中删除 `worker-dpdk` 标签

    $ oc label node <node_name> node-role.kubernetes.io/worker-dpdk-
  2. 通过输入以下命令删除包含 `worker-dpdk` 标签的 `MachineConfigPool` 清单

    $ oc delete mcp worker-dpdk

为 DPDK 工作负载配置项目

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

先决条件
  • 您的集群已配置为运行 DPDK 工作负载。

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

    $ oc create ns dpdk-checkup-ns
  2. 创建一个引用SriovNetworkNodePolicy对象的SriovNetwork对象。创建SriovNetwork对象时,SR-IOV网络操作符会自动创建一个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工作负载。

配置用于DPDK工作负载的虚拟机

您可以在虚拟机 (VM) 上运行数据包开发套件 (DPDK) 工作负载,以实现更低的延迟和更高的吞吐量,从而加快用户空间中的数据包处理速度。DPDK 使用 SR-IOV 网络进行基于硬件的 I/O 共享。

先决条件
  • 您的集群已配置为运行 DPDK 工作负载。

  • 您已创建并配置了 VM 将在其上运行的项目。

步骤
  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 禁用 CPU 配额。
    3 此注释指定对容器使用的 CPU 禁用中断请求 (IRQ) 负载均衡。
    4 VM 内的套接字数。为了使 CPU 从相同的非一致性内存访问 (NUMA) 节点进行调度,此字段必须设置为1
    5 VM 内的核心数。这必须大于或等于1的值。在此示例中,VM 使用 5 个超线程或 10 个 CPU 进行调度。
    6 巨页的大小。x86-64 架构的可能值为 1Gi 和 2Mi。在此示例中,请求的是 8 个大小为 1Gi 的巨页。
    7 SR-IOV NetworkAttachmentDefinition 对象的名称。
  2. 保存并退出编辑器。

  3. 应用VirtualMachine清单

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

    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) 预留用于维护任务,其余 CPU 则隔离用于 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. 重新启动 VM 以应用更改。