$ oc label node <node_name> node-role.kubernetes.io/worker-dpdk=""
数据平面开发套件 (DPDK) 提供了一套用于快速数据包处理的库和驱动程序。
您可以配置集群和虚拟机 (VM) 以通过 SR-IOV 网络运行 DPDK 工作负载。
您可以配置 OpenShift Container Platform 集群以运行数据平面开发套件 (DPDK) 工作负载,以提高网络性能。
您可以以具有 `cluster-admin` 权限的用户身份访问集群。
您已安装 OpenShift CLI (`oc`)。
您已安装 SR-IOV 网络运算符。
您已安装节点调整运算符。
映射您的计算节点拓扑以确定哪些非一致性内存访问 (NUMA) CPU 专门用于 DPDK 应用程序,哪些 CPU 保留用于操作系统 (OS)。
如果您的 OpenShift Container Platform 集群使用单独的控制平面和计算节点以实现高可用性
使用自定义角色标记计算节点的子集;例如,`worker-dpdk`
$ oc label node <node_name> node-role.kubernetes.io/worker-dpdk=""
创建一个新的 `MachineConfigPool` 清单,该清单在 `spec.machineConfigSelector` 对象中包含 `worker-dpdk` 标签
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。
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 的计算节点使用同时多线程 (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 计数提高到偶数。 |
创建一个 `SriovNetworkNodePolicy` 对象,并将 `spec.deviceType` 字段设置为 `vfio-pci`
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` 清单来创建自定义机器配置池。
通过运行以下命令从计算节点中删除 `worker-dpdk` 标签
$ oc label node <node_name> node-role.kubernetes.io/worker-dpdk-
通过输入以下命令删除包含 `worker-dpdk` 标签的 `MachineConfigPool` 清单
$ oc delete mcp worker-dpdk
您可以配置项目以在 SR-IOV 硬件上运行 DPDK 工作负载。
您的集群已配置为运行 DPDK 工作负载。
为您的 DPDK 应用程序创建一个命名空间
$ oc create ns dpdk-checkup-ns
创建一个引用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 属性的值。 |
可选:运行虚拟机延迟检查以验证网络是否已正确配置。
可选:运行DPDK检查以验证命名空间是否已准备好用于DPDK工作负载。
您可以在虚拟机 (VM) 上运行数据包开发套件 (DPDK) 工作负载,以实现更低的延迟和更高的吞吐量,从而加快用户空间中的数据包处理速度。DPDK 使用 SR-IOV 网络进行基于硬件的 I/O 共享。
您的集群已配置为运行 DPDK 工作负载。
您已创建并配置了 VM 将在其上运行的项目。
编辑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 对象的名称。 |
保存并退出编辑器。
应用VirtualMachine
清单
$ oc apply -f <file_name>.yaml
配置客户操作系统。以下示例显示了 RHEL 9 操作系统的配置步骤
使用 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) 预留用于维护任务,其余 CPU 则隔离用于 DPDK 应用程序。
$ tuned-adm profile cpu-partitioning
使用driverctl
设备驱动程序控制实用程序覆盖 SR-IOV NIC 驱动程序
$ dnf install -y driverctl
$ driverctl set-override 0000:07:00.0 vfio-pci
重新启动 VM 以应用更改。