9.6. SR-IOV 및 노드 튜닝 연산자를 사용하여 DPDK 라인 속도 달성


노드 튜닝 연산자를 사용하면 격리된 CPU, 거대 페이지 및 토폴로지 스케줄러를 구성할 수 있습니다. 그런 다음 SR-IOV(Single Root I/O Virtualization)와 함께 노드 튜닝 연산자를 사용하여 특정 DPDK(Data Plane Development Kit) 라인 속도를 달성할 수 있습니다.

사전 요구 사항

  • OpenShift CLI(oc)가 설치되어 있습니다.
  • SR-IOV Network Operator가 설치되어 있습니다.
  • 클러스터 관리자 권한이 있는 사용자로 로그인했습니다.
  • 독립형 노드 튜닝 운영자를 배포했습니다.

    참고

    이전 버전의 OpenShift Container Platform에서는 Performance Addon Operator를 사용하여 OpenShift 애플리케이션의 저지연 성능을 달성하기 위한 자동 튜닝을 구현했습니다. OpenShift Container Platform 4.11 이상에서는 이 기능이 Node Tuning Operator의 일부입니다.

프로세스

  1. 다음 예제를 기반으로 PerformanceProfile 객체를 만듭니다.

    apiVersion: performance.openshift.io/v2
    kind: PerformanceProfile
    metadata:
      name: performance
    spec:
      globallyDisableIrqLoadBalancing: true
      cpu:
        isolated: 21-51,73-103 
    1
    
        reserved: 0-20,52-72 
    2
    
      hugepages:
        defaultHugepagesSize: 1G 
    3
    
        pages:
          - count: 32
            size: 1G
      net:
        userLevelNetworking: true
      numa:
        topologyPolicy: "single-numa-node"
      nodeSelector:
        node-role.kubernetes.io/worker-cnf: ""
    Copy to Clipboard Toggle word wrap
    1
    시스템에서 하이퍼스레딩이 활성화된 경우, 격리 되고 예약된 CPU 그룹에 관련 심볼릭 링크를 할당합니다. 시스템에 여러 개의 비균일 메모리 액세스 노드(NUMA)가 포함되어 있는 경우 두 NUMA의 CPU를 두 그룹에 할당합니다. 이 작업에는 성과 프로필 생성기를 사용할 수도 있습니다. 자세한 내용은 성과 프로필 만들기를 참조하세요.
    2
    또한, 예약된 CPU 수에 맞춰 대기열이 설정될 장치 목록을 지정할 수도 있습니다. 자세한 내용은 노드 튜닝 연산자를 사용하여 NIC 대기열 줄이기를 참조하세요.
    3
    필요한 거대페이지의 수와 크기를 할당합니다. 거대한 페이지에 대한 NUMA 구성을 지정할 수 있습니다. 기본적으로 시스템은 시스템의 모든 NUMA 노드에 짝수를 할당합니다. 필요한 경우 노드에 대한 실시간 커널 사용을 요청할 수 있습니다. 자세한 내용은 실시간 기능을 갖춘 근로자 프로비저닝을 참조하세요.
  2. yaml 파일을 mlx-dpdk-perfprofile-policy.yaml 로 저장합니다.
  3. 다음 명령을 사용하여 성능 프로필을 적용합니다.

    $ oc create -f mlx-dpdk-perfprofile-policy.yaml
    Copy to Clipboard Toggle word wrap

9.6.1. 컨테이너 애플리케이션에서 사용하는 DPDK 라이브러리

선택적 라이브러리app-netutil은 해당 포드에서 실행 중인 컨테이너 내에서 포드에 관한 네트워크 정보를 수집하기 위해 여러 API 메서드를 제공합니다.

이 라이브러리는 DPDK(Data Plane Development Kit) 모드의 SR-IOV VF(가상 기능)를 컨테이너에 통합하는 데 도움이 될 수 있습니다. 라이브러리는 Golang API와 C API를 모두 제공합니다.

현재 세 가지 API 메서드가 구현되어 있습니다.

GetCPUInfo()
이 함수는 컨테이너에서 사용할 수 있는 CPU를 결정하고 목록을 반환합니다.
GetHugepages()
이 함수는 각 컨테이너에 대해 Pod 사양에서 요청된 대량의 페이지 메모리의 양을 결정하고 값을 반환합니다.
GetInterfaces()
이 함수는 컨테이너의 인터페이스 집합을 결정하고 목록을 반환합니다. 반환 값에는 각 인터페이스에 대한 인터페이스 유형 및 유형별 데이터가 포함됩니다.

라이브러리 리포지토리에는 컨테이너 이미지 dpdk-app-centos를 빌드하는 샘플 Dockerfile이 포함되어 있습니다. 컨테이너 이미지는 pod 사양의 환경 변수에 따라 다음 DPDK 샘플 애플리케이션 중 하나를 실행할 수 있습니다. l2fwd,l3wd 또는 testpmd. 컨테이너 이미지는 app-netutil 라이브러리를 컨테이너 이미지 자체에 통합하는 예를 제공합니다. 라이브러리는 init 컨테이너에 통합할 수도 있습니다. init 컨테이너는 필요한 데이터를 수집하고 기존 DPDK 워크로드에 데이터를 전달할 수 있습니다.

9.6.2. 가상 함수를 위한 SR-IOV 네트워크 운영자 예시

SR-IOV(단일 루트 I/O 가상화) 네트워크 운영자를 사용하여 노드의 SR-IOV 지원 물리적 기능 NIC에서 가상 기능(VF)을 할당하고 구성할 수 있습니다.

Operator 배포에 대한 자세한 내용은 SR-IOV 네트워크 Operator 설치를 참조하세요. SR-IOV 네트워크 장치 구성에 대한 자세한 내용은 SR-IOV 네트워크 장치 구성을 참조하세요.

Intel VF와 Mellanox VF에서 DPDK(Data Plane Development Kit) 워크로드를 실행하는 데에는 몇 가지 차이점이 있습니다. 이 섹션에서는 두 가지 VF 유형에 대한 개체 구성 예를 제공합니다. 다음은 Intel NIC에서 DPDK 애플리케이션을 실행하는 데 사용되는 sriovNetworkNodePolicy 개체의 예입니다.

apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetworkNodePolicy
metadata:
  name: dpdk-nic-1
  namespace: openshift-sriov-network-operator
spec:
  deviceType: vfio-pci 
1

  needVhostNet: true 
2

  nicSelector:
    pfNames: ["ens3f0"]
  nodeSelector:
    node-role.kubernetes.io/worker-cnf: ""
  numVfs: 10
  priority: 99
  resourceName: dpdk_nic_1
---
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetworkNodePolicy
metadata:
  name: dpdk-nic-1
  namespace: openshift-sriov-network-operator
spec:
  deviceType: vfio-pci
  needVhostNet: true
  nicSelector:
    pfNames: ["ens3f1"]
  nodeSelector:
  node-role.kubernetes.io/worker-cnf: ""
  numVfs: 10
  priority: 99
  resourceName: dpdk_nic_2
Copy to Clipboard Toggle word wrap
1
Intel NIC의 경우 deviceType은 vfio-pci 여야 합니다.
2
DPDK 워크로드와 커널 통신이 필요한 경우 needVhostNet: true를 추가합니다. 이렇게 하면 /dev/net/tun/dev/vhost-net 장치가 컨테이너에 마운트되어 애플리케이션이 탭 장치를 생성하고 해당 탭 장치를 DPDK 워크로드에 연결할 수 있습니다.

다음은 Mellanox NIC에 대한 sriovNetworkNodePolicy 개체의 예입니다.

apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetworkNodePolicy
metadata:
  name: dpdk-nic-1
  namespace: openshift-sriov-network-operator
spec:
  deviceType: netdevice 
1

  isRdma: true 
2

  nicSelector:
    rootDevices:
      - "0000:5e:00.1"
  nodeSelector:
    node-role.kubernetes.io/worker-cnf: ""
  numVfs: 5
  priority: 99
  resourceName: dpdk_nic_1
---
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetworkNodePolicy
metadata:
  name: dpdk-nic-2
  namespace: openshift-sriov-network-operator
spec:
  deviceType: netdevice
  isRdma: true
  nicSelector:
    rootDevices:
      - "0000:5e:00.0"
  nodeSelector:
    node-role.kubernetes.io/worker-cnf: ""
  numVfs: 5
  priority: 99
  resourceName: dpdk_nic_2
Copy to Clipboard Toggle word wrap
1
Mellanox 장치의 경우 deviceTypenetdevice 여야 합니다.
2
Mellanox 장치의 경우 isRdma는 true 여야 합니다. Mellanox 카드는 Flow Bifurcation을 사용하여 DPDK 애플리케이션에 연결됩니다. 이 메커니즘은 Linux 사용자 공간과 커널 공간 간의 트래픽을 분할하고 라인 속도 처리 기능을 향상시킬 수 있습니다.

9.6.3. SR-IOV 네트워크 운영자 예시

다음은 sriovNetwork 객체의 정의 예입니다. 이 경우 Intel과 Mellanox 구성은 동일합니다.

apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetwork
metadata:
  name: dpdk-network-1
  namespace: openshift-sriov-network-operator
spec:
  ipam: '{"type": "host-local","ranges": [[{"subnet": "10.0.1.0/24"}]],"dataDir":
   "/run/my-orchestrator/container-ipam-state-1"}' 
1

  networkNamespace: dpdk-test 
2

  spoofChk: "off"
  trust: "on"
  resourceName: dpdk_nic_1 
3

---
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetwork
metadata:
  name: dpdk-network-2
  namespace: openshift-sriov-network-operator
spec:
  ipam: '{"type": "host-local","ranges": [[{"subnet": "10.0.2.0/24"}]],"dataDir":
   "/run/my-orchestrator/container-ipam-state-1"}'
  networkNamespace: dpdk-test
  spoofChk: "off"
  trust: "on"
  resourceName: dpdk_nic_2
Copy to Clipboard Toggle word wrap
1
Whereabouts와 같은 다른 IP 주소 관리(IPAM) 구현을 사용할 수 있습니다. 자세한 내용은 Whereabouts를 사용한 동적 IP 주소 할당 구성을 참조하세요.
2
네트워크 연결 정의가 생성될 networkNamespace 를 요청해야 합니다. openshift-sriov-network-operator 네임스페이스 아래에 sriovNetwork CR을 만들어야 합니다.
3
resourceName 값은 sriovNetworkNodePolicy 에서 생성된 resourceName 값과 일치해야 합니다.

9.6.4. DPDK 기반 워크로드 예시

다음은 DPDK(Data Plane Development Kit) 컨테이너의 예입니다.

apiVersion: v1
kind: Namespace
metadata:
  name: dpdk-test
---
apiVersion: v1
kind: Pod
metadata:
  annotations:
    k8s.v1.cni.cncf.io/networks: '[ 
1

     {
      "name": "dpdk-network-1",
      "namespace": "dpdk-test"
     },
     {
      "name": "dpdk-network-2",
      "namespace": "dpdk-test"
     }
   ]'
    irq-load-balancing.crio.io: "disable" 
2

    cpu-load-balancing.crio.io: "disable"
    cpu-quota.crio.io: "disable"
  labels:
    app: dpdk
  name: testpmd
  namespace: dpdk-test
spec:
  runtimeClassName: performance-performance 
3

  containers:
    - command:
        - /bin/bash
        - -c
        - sleep INF
      image: registry.redhat.io/openshift4/dpdk-base-rhel8
      imagePullPolicy: Always
      name: dpdk
      resources: 
4

        limits:
          cpu: "16"
          hugepages-1Gi: 8Gi
          memory: 2Gi
        requests:
          cpu: "16"
          hugepages-1Gi: 8Gi
          memory: 2Gi
      securityContext:
        capabilities:
          add:
            - IPC_LOCK
            - SYS_RESOURCE
            - NET_RAW
            - NET_ADMIN
        runAsUser: 0
      volumeMounts:
        - mountPath: /mnt/huge
          name: hugepages
  terminationGracePeriodSeconds: 5
  volumes:
    - emptyDir:
        medium: HugePages
      name: hugepages
Copy to Clipboard Toggle word wrap
1
필요한 SR-IOV 네트워크를 요청하세요. 장치에 대한 리소스는 자동으로 주입됩니다.
2
CPU 및 IRQ 부하 분산 기반을 비활성화합니다. 자세한 내용은 개별 포드에 대한 인터럽트 처리 비활성화를 참조하세요.
3
runtimeClass를 performance-performance 로 설정합니다. runtimeClass를 HostNetwork 또는 privileged 로 설정하지 마세요.
4
보장된 서비스 품질(QoS)로 포드를 시작하려면 요청과 제한에 대해 동일한 수의 리소스를 요청합니다.
참고

SLEEP 으로 Pod를 시작한 다음 Pod에 exec를 실행하여 testpmd 또는 DPDK 워크로드를 시작하지 마세요. exec 프로세스가 어떤 CPU에도 고정되지 않으므로 추가적인 인터럽트가 발생할 수 있습니다.

9.6.5. testpmd 스크립트 예시

다음은 testpmd를 실행하기 위한 스크립트 예입니다.

#!/bin/bash
set -ex
export CPU=$(cat /sys/fs/cgroup/cpuset/cpuset.cpus)
echo ${CPU}

dpdk-testpmd -l ${CPU} -a ${PCIDEVICE_OPENSHIFT_IO_DPDK_NIC_1} -a ${PCIDEVICE_OPENSHIFT_IO_DPDK_NIC_2} -n 4 -- -i --nb-cores=15 --rxd=4096 --txd=4096 --rxq=7 --txq=7 --forward-mode=mac --eth-peer=0,50:00:00:00:00:01 --eth-peer=1,50:00:00:00:00:02
Copy to Clipboard Toggle word wrap

이 예제에서는 두 개의 서로 다른 sriovNetwork CR을 사용합니다. 환경 변수에는 포드에 할당된 가상 함수(VF) PCI 주소가 포함되어 있습니다. Pod 정의에서 동일한 네트워크를 사용하는 경우 pciAddress를 분할해야 합니다. 트래픽 생성기의 올바른 MAC 주소를 구성하는 것이 중요합니다. 이 예제에서는 사용자 지정 MAC 주소를 사용합니다.

맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2025 Red Hat