8.6. SR-IOV와 함께 DPDK 사용
DPDK(Data Plane Development Kit)는 빠른 패킷 처리를 위한 라이브러리 및 드라이버 세트를 제공합니다.
SR-IOV 네트워크에서 DPDK 워크로드를 실행하도록 클러스터 및 VM(가상 머신)을 구성할 수 있습니다.
8.6.1. DPDK 워크로드에 대한 클러스터 구성
네트워크 성능을 개선하기 위해 DPDK(Data Plane Development Kit) 워크로드를 실행하도록 OpenShift Container Platform 클러스터를 구성할 수 있습니다.
사전 요구 사항
-
cluster-admin
권한이 있는 사용자로 클러스터에 액세스할 수 있습니다. -
OpenShift CLI(
oc
)가 설치되어 있습니다. - SR-IOV Network Operator가 설치되어 있습니다.
- Node Tuning Operator가 설치되어 있습니다.
프로세스
- 컴퓨팅 노드 토폴로지를 매핑하여 DPDK 애플리케이션에 대해 분리된 NUMA(Non-Uniform Memory Access) CPU와 운영 체제(OS)용으로 예약된 CPU를 결정합니다.
사용자 지정 역할을 사용하여 컴퓨팅 노드의 하위 집합에 레이블을 지정합니다(예:
worker-dpdk
).$ oc label node <node_name> node-role.kubernetes.io/worker-dpdk=""
spec.machineConfigSelector
오브젝트에worker-dpdk
라벨이 포함된 새MachineConfigPool
매니페스트를 생성합니다.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을 편집하면 변경 사항을 적용한 후 생성되는 모든 VM에 영향을 미치는 글로벌 설정이 변경됩니다.DPDK 지원 컴퓨팅 노드에서 SMT(Simultaneous multithreading)를 사용하는 경우
HyperConverged
CR을 편집하여AlignCPUs
enabler를 활성화합니다.$ oc patch hyperconverged kubevirt-hyperconverged -n openshift-cnv \ --type='json' -p='[{"op": "replace", "path": "/spec/featureGates/alignCPUs", "value": true}]'
참고AlignCPUs
를 활성화하면 OpenShift Virtualization에서 최대 두 개의 추가 전용 CPU를 요청하여 에뮬레이터 스레드 격리를 사용할 때 총 CPU 수를 균등하게 지정할 수 있습니다.spec.deviceType
필드가vfio-pci
로 설정된SriovNetworkNodePolicy
오브젝트를 생성합니다.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
NodePolicySriovNetwork
오브젝트를 생성하면 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(가상 머신)에서 DPDK(Data Packet Development Kit) 워크로드를 실행하여 대기 시간을 줄이고 사용자 공간에서 더 빠른 패킷 처리를 위해 처리량을 높일 수 있습니다. DPDK는 하드웨어 기반 I/O 공유에 SR-IOV 네트워크를 사용합니다.
사전 요구 사항
- 클러스터는 DPDK 워크로드를 실행하도록 구성되어 있습니다.
- VM을 실행할 프로젝트를 생성하고 구성했습니다.
프로세스
SR-IOV 네트워크 인터페이스, CPU 토폴로지, CRI-O 주석 및 대규모 페이지에 대한 정보를 포함하도록
VirtualMachine
매니페스트를 편집합니다.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에 대해 Interrupt Request(IRQ) 로드 밸런싱이 비활성화됨을 지정합니다.
- 4
- VM 내부의 소켓 수입니다. 동일한 NUMA(Non-Uniform Memory Access) 노드에서 CPU를 예약하려면 이 필드를
1
로 설정해야 합니다. - 5
- VM 내부의 코어 수입니다. 이 값은
1
보다 크거나 같아야 합니다. 이 예에서는 VM이 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)는 하우스 유지 작업을 위해 별도로 설정되고 나머지 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을 다시 시작하여 변경 사항을 적용합니다.