8.6. SR-IOV와 함께 DPDK 사용


DPDK(Data Plane Development Kit)는 빠른 패킷 처리를 위한 라이브러리 및 드라이버 세트를 제공합니다.

SR-IOV 네트워크에서 DPDK 워크로드를 실행하도록 클러스터 및 VM(가상 머신)을 구성할 수 있습니다.

중요

DPDK 워크로드 실행은 기술 프리뷰 기능 전용입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.

Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.

8.6.1. DPDK 워크로드에 대한 클러스터 구성

네트워크 성능을 개선하기 위해 DPDK(Data Plane Development Kit) 워크로드를 실행하도록 OpenShift Container Platform 클러스터를 구성할 수 있습니다.

사전 요구 사항

  • cluster-admin 권한이 있는 사용자로 클러스터에 액세스할 수 있습니다.
  • OpenShift CLI(oc)가 설치되어 있습니다.
  • SR-IOV Network Operator가 설치되어 있습니다.
  • Node Tuning Operator가 설치되어 있습니다.

프로세스

  1. 컴퓨팅 노드 토폴로지를 매핑하여 DPDK 애플리케이션에 대해 분리된 NUMA(Non-Uniform Memory Access) CPU와 운영 체제(OS)용으로 예약된 CPU를 결정합니다.
  2. 사용자 지정 역할을 사용하여 컴퓨팅 노드의 하위 집합에 레이블을 지정합니다(예: worker-dpdk ).

    $ oc label node <node_name> node-role.kubernetes.io/worker-dpdk=""
  3. 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: ""

  4. 이전 단계에서 생성한 라벨이 지정된 노드 및 머신 구성 풀에 적용되는 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

    참고

    MachineConfigPoolPerformanceProfile 매니페스트를 적용한 후 컴퓨팅 노드가 자동으로 다시 시작됩니다.

  5. PerformanceProfile 오브젝트의 status.runtimeClass 필드에서 생성된 RuntimeClass 리소스의 이름을 검색합니다.

    $ oc get performanceprofiles.performance.openshift.io profile-1 -o=jsonpath='{.status.runtimeClass}{"\n"}'
  6. 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에 영향을 미치는 글로벌 설정이 변경됩니다.

  7. 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 워크로드를 실행하도록 구성되어 있습니다.

프로세스

  1. DPDK 애플리케이션의 네임스페이스를 생성합니다.

    $ oc create ns dpdk-checkup-ns
  2. SriovNetwork NodePolicy 오브젝트를 참조하는 SriovNetwork 오브젝트를 생성합니다. 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

    1
    NetworkAttachmentDefinition 오브젝트가 배포된 네임스페이스입니다.
    2
    DPDK 워크로드에 대한 클러스터를 구성할 때 생성된 SriovNetworkNodePolicy 오브젝트의 spec.resourceName 속성 값입니다.
  3. 선택 사항: 가상 머신 대기 시간 검사를 실행하여 네트워크가 올바르게 구성되었는지 확인합니다.
  4. 선택 사항: DPDK 검사를 실행하여 네임스페이스가 DPDK 워크로드에 대해 준비되었는지 확인합니다.

8.6.3. DPDK 워크로드를 위한 가상 머신 구성

VM(가상 머신)에서 DPDK(Data Packet Development Kit) 워크로드를 실행하여 대기 시간을 줄이고 사용자 공간에서 더 빠른 패킷 처리를 위해 처리량을 높일 수 있습니다. DPDK는 하드웨어 기반 I/O 공유에 SR-IOV 네트워크를 사용합니다.

사전 요구 사항

  • 클러스터는 DPDK 워크로드를 실행하도록 구성되어 있습니다.
  • VM을 실행할 프로젝트를 생성하고 구성했습니다.

프로세스

  1. 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 오브젝트의 이름입니다.
  2. 편집기를 저장하고 종료합니다.
  3. VirtualMachine 매니페스트를 적용합니다.

    $ oc apply -f <file_name>.yaml
  4. 게스트 운영 체제를 구성합니다. 다음 예제에서는 RHEL 8 OS의 구성 단계를 보여줍니다.

    1. GRUB 부트로더 명령줄 인터페이스를 사용하여 대규모 페이지를 구성합니다. 다음 예제에서는 8개의 1G 대규모 페이지가 지정됩니다.

      $ grubby --update-kernel=ALL --args="default_hugepagesz=1GB hugepagesz=1G hugepages=8"
    2. 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
    3. driverctl 장치 드라이버 제어 유틸리티를 사용하여 SR-IOV NIC 드라이버를 재정의합니다.

      $ dnf install -y driverctl
      $ driverctl set-override 0000:07:00.0 vfio-pci
  5. VM을 다시 시작하여 변경 사항을 적용합니다.
Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

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

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

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

Red Hat 소개

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

© 2024 Red Hat, Inc.