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-launcher
pod 的默认容器运行时类:$ oc patch hyperconverged kubevirt-hyperconverged -n openshift-cnv \ --type='json' -p='[{"op": "add", "path": "/spec/defaultRuntimeClass", "value":"<runtimeclass-name>"}]'
注意编辑
HyperConverged
CR 会更改影响更改后创建的所有虚拟机的全局设置。如果您的启用 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 总数引入到甚至奇偶校验。创建一个
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-ns 1 resourceName: intel_nics_dpdk 2 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: 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
对象的名称。
- 保存并退出编辑器。
应用
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
- 重启虚拟机以应用更改。