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。
流程
- 映射计算节点拓扑,以确定为 DPDK 应用程序隔离哪些非统一内存访问 (NUMA) CPU,以及为操作系统 (OS) 保留哪些非一致性内存访问 (NUMA) CPU。
使用自定义角色标记计算节点的子集,例如
worker-dpdk:$ oc label node <node_name> node-role.kubernetes.io/worker-dpdk=""创建一个新的
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: ""创建一个
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清单后,计算节点会自动重启。从
PerformanceProfile对象的status.runtimeClass字段检索生成的RuntimeClass资源的名称:$ oc get performanceprofiles.performance.openshift.io profile-1 -o=jsonpath='{.status.runtimeClass}{"\n"}'通过编辑
HyperConverged自定义资源 (CR) 将之前获取的RuntimeClass名称设置为virt-launcherpod 的默认容器运行时类:$ oc patch hyperconverged kubevirt-hyperconverged -n openshift-cnv \ --type='json' -p='[{"op": "add", "path": "/spec/defaultRuntimeClass", "value":"<runtimeclass-name>"}]'注意编辑
HyperConvergedCR 会更改影响更改后创建的所有虚拟机的全局设置。如果您的启用 DPDK 的计算节点使用 Simultaneous 多线程 (SMT),请通过编辑
HyperConvergedCR 来启用AlignCPUsenabler:$ oc patch hyperconverged kubevirt-hyperconverged -n openshift-cnv \ --type='json' -p='[{"op": "replace", "path": "/spec/featureGates/alignCPUs", "value": true}]'注意启用
AlignCPU可让 OpenShift Virtualization 请求两个额外的专用 CPU,在使用仿真程序线程隔离时将 CPU 总数引入到甚至奇偶校验。创建一个
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 工作负载。
流程
为您的 DPDK 应用程序创建一个命名空间:
$ oc create ns dpdk-checkup-ns创建一个
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-ns1 resourceName: intel_nics_dpdk2 spoofChk: "off" trust: "on" vlan: 1019- 可选:运行虚拟机延迟检查以验证网络是否已正确配置。
- 可选:运行 DPDK 检查,以验证命名空间是否已准备好 DPDK 工作负载。
8.6.3. 为 DPDK 工作负载配置虚拟机 复制链接链接已复制到粘贴板!
您可以在虚拟机 (VM) 上运行 Data Packet Development Kit (DPDK) 工作负载,以实现较低延迟和更高的吞吐量,以便在用户空间中更快地处理数据包。DPDK 使用 SR-IOV 网络进行基于硬件的 I/O 共享。
先决条件
- 集群被配置为运行 DPDK 工作负载。
- 您已创建并配置了运行虚拟机的项目。
流程
编辑
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: disable1 cpu-quota.crio.io: disable2 irq-load-balancing.crio.io: disable3 spec: domain: cpu: sockets: 14 cores: 55 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: 1Gi6 guest: 8Gi networks: - name: default pod: {} - multus: networkName: dpdk-net7 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对象的名称。
- 保存并退出编辑器。
应用
VirtualMachine清单:$ oc apply -f <file_name>.yaml配置客户机操作系统。以下示例显示了 RHEL 8 OS 的配置步骤:
使用 GRUB 引导装载程序命令行界面配置巨页。在以下示例中,指定了 8 个 1G 巨页。
$ grubby --update-kernel=ALL --args="default_hugepagesz=1GB hugepagesz=1G hugepages=8"要使用 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使用
driverctl设备驱动程序控制工具覆盖 SR-IOV NIC 驱动程序:$ dnf install -y driverctl$ driverctl set-override 0000:07:00.0 vfio-pci
- 重启虚拟机以应用更改。