7.4. OVS-DPDK 매개변수 수동 계산

이 섹션에서는 OVS-DPDK에서 director network_environment.yaml heat 템플릿 내에서 매개변수를 사용하여 최적의 성능을 위해 CPU 및 메모리를 구성하는 방법에 대해 설명합니다. 이 정보를 사용하여 컴퓨팅 노드에서 하드웨어 지원을 평가하고 OVS-DPDK 배포를 최적화하는 하드웨어를 분할하는 방법을 평가합니다.

참고

대신 drive _parameters.yaml 워크플로우를 사용하여 이러한 값을 생성하는 방법에 대한 자세한 내용은 워크플로 개요 및 파생 매개 변수를 참조하십시오.

참고

CPU 코어를 할당할 때 항상 CPU 스위칭 스레드 또는 논리적 CPU를 물리 코어에 쌍으로 연결합니다.

Compute 노드에서 CPU 및 NUMA 노드를 결정하는 방법에 대한 자세한 내용은 NUMA 노드 토폴로지 검색을 참조하십시오. 이 정보를 사용하여 CPU 및 기타 매개 변수를 매핑하여 호스트, 게스트 인스턴스 및 OVS-DPDK 프로세스 요구 사항을 지원합니다.

7.4.1. CPU 매개변수

OVS-DPDK는 CPU 파티셔닝에 다음 매개변수를 사용합니다.

OvsPmdCoreList

DPDK 폴링 모드 드라이버(PMD)에 사용되는 CPU 코어를 제공합니다. DPDK 인터페이스의 로컬 NUMA 노드와 연결된 CPU 코어를 선택합니다. OVS의 pmd-cpu-mask 값으로 OvsPmdCoreList 를 사용합니다. OvsPmdCoreList 에 다음 권장 사항을 사용하십시오.

  • 스위칭 스레드를 쌍으로 연결합니다.
  • 성능은 이 PMD Core 목록에 할당된 물리적 코어 수에 따라 다릅니다. DPDK NIC와 연결된 NUMA 노드에서 필요한 코어를 할당합니다.
  • DPDK NIC가 있는 NUMA 노드의 경우 성능 요구 사항에 따라 필요한 물리적 코어 수를 확인하고 각 물리적 코어에 대해 모든 시블링 스레드 또는 논리 CPU를 포함합니다.
  • DPDK NIC가 없는 NUMA 노드의 경우 NUMA 노드의 첫 번째 물리적 코어를 제외한 모든 물리적 코어의 시블링 스레드 또는 논리적 CPU를 할당합니다.
참고

NUMA 노드에 연결된 DPDK NIC가 없는 경우에도 두 NUMA 노드에서 DPDK PMD 스레드를 예약해야 합니다.

NovaComputeCpuDedicatedSet

고정된 인스턴스 CPU 프로세스를 예약할 수 있는 쉼표로 구분된 물리적 호스트 CPU 목록 또는 범위입니다. 예를 들어, NovaComputeCpuDedicatedSet: [4-12,^8,15] 는 8을 제외하고 4-12 및 15의 코어를 예약합니다.

  • OvsPmdCoreList 에서 모든 코어를 제외합니다.
  • 나머지 코어를 모두 포함합니다.
  • 스위칭 스레드를 쌍으로 연결합니다.
NovaComputeCpuSharedSet
인스턴스 에뮬레이터 스레드의 호스트 CPU를 결정하는 데 사용되는 쉼표로 구분된 물리적 호스트 CPU 번호 목록 또는 범위입니다.
IsolCpusList

호스트 프로세스에서 격리된 CPU 코어 집합입니다. IsolCpusListtuned-profiles-cpu -partitioning 구성 요소에 대한 cpu-partitioning- variable.conf 파일의 isolated_cores 값입니다. 다음 IsolCpusList 권장 사항을 사용하십시오.

  • OvsPmdCoreListNovaComputeCpuDedicatedSet의 코어 목록을 일치시킵니다.
  • 스위칭 스레드를 쌍으로 연결합니다.
DerivePciWhitelistEnabled

VM에 VF(가상 기능)를 예약하려면 NovaPCIPassthrough 매개 변수를 사용하여 Nova에 전달된 VF 목록을 생성합니다. 목록에서 제외된 VFS는 호스트에 계속 사용할 수 있습니다.

목록의 각 VF에 대해 address 값으로 확인되는 정규식으로 address 매개 변수를 채웁니다.

다음은 수동 목록 생성 프로세스의 예입니다. eno2 라는 장치에서 NIC 파티셔닝이 활성화된 경우 다음 명령을 사용하여 VF의 PCI 주소를 나열합니다.

[heat-admin@compute-0 ~]$ ls -lh /sys/class/net/eno2/device/ | grep virtfn
lrwxrwxrwx. 1 root root    0 Apr 16 09:58 virtfn0 -> ../0000:18:06.0
lrwxrwxrwx. 1 root root    0 Apr 16 09:58 virtfn1 -> ../0000:18:06.1
lrwxrwxrwx. 1 root root    0 Apr 16 09:58 virtfn2 -> ../0000:18:06.2
lrwxrwxrwx. 1 root root    0 Apr 16 09:58 virtfn3 -> ../0000:18:06.3
lrwxrwxrwx. 1 root root    0 Apr 16 09:58 virtfn4 -> ../0000:18:06.4
lrwxrwxrwx. 1 root root    0 Apr 16 09:58 virtfn5 -> ../0000:18:06.5
lrwxrwxrwx. 1 root root    0 Apr 16 09:58 virtfn6 -> ../0000:18:06.6
lrwxrwxrwx. 1 root root    0 Apr 16 09:58 virtfn7 -> ../0000:18:06.7

이 경우 VF 0, 4, 6은 NIC 파티셔닝에 eno2 에서 사용됩니다. 다음 예와 같이 VF 1-3, 5, 7을 포함하도록 NovaPCIPassthrough 를 수동으로 구성하고, 결과적으로 VF 0,4, 및 6을 제외합니다.

NovaPCIPassthrough:
  - physical_network: "sriovnet2"
  address: {"domain": ".*", "bus": "18", "slot": "06", "function": "[1-3]"}
  - physical_network: "sriovnet2"
  address: {"domain": ".*", "bus": "18", "slot": "06", "function": "[5]"}
  - physical_network: "sriovnet2"
  address: {"domain": ".*", "bus": "18", "slot": "06", "function": "[7]"}

7.4.2. 메모리 매개변수

OVS-DPDK는 다음 메모리 매개변수를 사용합니다.

OvsDpdkMemoryChannels

NUMA 노드당 CPU에 메모리 채널을 매핑합니다. OvsDpdkMemoryChannels 는 OVS의 other_config:dpdk-extra="-n <value>" 값입니다. OvsDpdkMemoryChannels 에 대한 다음 권장 사항을 확인하십시오.

  • dmidecode -t 메모리 또는 하드웨어 설명서를 사용하여 사용 가능한 메모리 채널 수를 확인합니다.
  • ls /sys/devices/system/node/node* -d 를 사용하여 NUMA 노드 수를 확인합니다.
  • 사용 가능한 메모리 채널 수를 NUMA 노드 수로 나눕니다.
NovaReservedHostMemory

호스트의 작업을 위해 MB 단위의 메모리를 예약합니다. NovaReservedHostMemorynova.conf 의 컴퓨팅 노드의 reserved_host_memory_mb 값입니다. NovaReservedHostMemory 에 대한 다음 권장 사항을 확인합니다.

  • 정적 권장 값 4096MB를 사용합니다.
OvsDpdkSocketMemory

NUMA 노드당 hugepage 풀에서 사전 할당할 메모리 양을 지정합니다. OvsDpdkSocketMemory 는 OVS의 other_config:dpdk-socket-mem 값입니다. OvsDpdkSocketMemory 에 대한 다음 권장 사항을 확인하십시오.

  • 를 쉼표로 구분된 목록으로 제공합니다.
  • DPDK NIC가 없는 NUMA 노드의 경우 1024MB의 정적 권장 사항을 사용합니다(1GB)
  • NUMA 노드의 각 NIC의 MTU 값에서 OvsDpdkSocketMemory 값을 계산합니다.
  • 다음 식은 OvsDpdkSocketMemory 의 값을 대략적으로 나타냅니다.

    • MEMORY_REQD_PER_MTU = (ROUNDUP_PER_MTU + 800) * (4096 * 64) Bytes

      • 800은 오버헤드 값입니다.
      • 4096 * 64는 mempool의 패킷 수입니다.
  • NUMA 노드에 설정된 각 MTU 값에 대해 MEMORY_REQD_PER_MTU를 추가하고 추가로 512MB를 버퍼로 추가합니다. 값을 1024의 배수로 반올림합니다.

샘플 계산 - MTU 2000 및 MTU 9000

DPDK NICs dpdk0 및 dpdk1은 동일한 NUMA 노드 0에 있으며 각각 MTU 9000 및 2000으로 구성됩니다. 필요한 메모리를 분석하기 위한 샘플 계산은 다음과 같습니다.

  1. MTU 값을 1024바이트의 가장 가까운 배수로 반올림합니다.

    The MTU value of 9000 becomes 9216 bytes.
    The MTU value of 2000 becomes 2048 bytes.
  2. 반올림된 이러한 바이트 값을 기반으로 각 MTU 값에 필요한 메모리를 계산합니다.

    Memory required for 9000 MTU = (9216 + 800) * (4096*64) = 2625634304
    Memory required for 2000 MTU = (2048 + 800) * (4096*64) = 746586112
  3. 필요한 총 메모리를 바이트 단위로 계산합니다.

    2625634304 + 746586112 + 536870912 = 3909091328 bytes.

    이 계산은 (2000의 MTU에 필요한 메모리) + (2000의 MTU에 필요한 메모리) + (512 MB 버퍼)를 나타냅니다.

  4. 필요한 총 메모리를 MB로 변환합니다.

    3909091328 / (1024*1024) = 3728 MB.
  5. 이 값을 가장 가까운 1024로 반올림합니다.

    3724 MB rounds up to 4096 MB.
  6. 이 값을 사용하여 OvsDpdkSocketMemory 를 설정합니다.

        OvsDpdkSocketMemory: "4096,1024"

샘플 계산 - MTU 2000

DPDK NIC dpdk0 및 dpdk1은 동일한 NUMA 노드 0에 있으며, 각각 2000의 MTU로 구성됩니다. 필요한 메모리를 분석하기 위한 샘플 계산은 다음과 같습니다.

  1. MTU 값을 1024바이트의 가장 가까운 배수로 반올림합니다.

    The MTU value of 2000 becomes 2048 bytes.
  2. 반올림된 이러한 바이트 값을 기반으로 각 MTU 값에 필요한 메모리를 계산합니다.

    Memory required for 2000 MTU = (2048 + 800) * (4096*64) = 746586112
  3. 필요한 총 메모리를 바이트 단위로 계산합니다.

    746586112 + 536870912 = 1283457024 bytes.

    이 계산은 (2000의 MTU에 필요한 메모리) + (512 MB 버퍼)를 나타냅니다.

  4. 필요한 총 메모리를 MB로 변환합니다.

    1283457024 / (1024*1024) = 1224 MB.
  5. 이 값을 1024의 가장 가까운 배수로 반올림합니다.

    1224 MB rounds up to 2048 MB.
  6. 이 값을 사용하여 OvsDpdkSocketMemory 를 설정합니다.

        OvsDpdkSocketMemory: "2048,1024"

7.4.3. 네트워킹 매개변수

OvsDpdkDriverType
DPDK에서 사용하는 드라이버 유형을 설정합니다. 기본값 vfio-pci 를 사용합니다.
NeutronDatapathType
OVS 브리지의 데이터 경로 유형입니다. DPDK는 기본값 netdev 를 사용합니다.
NeutronVhostuserSocketDir
OVS의 vhost-user 소켓 디렉터리를 설정합니다. vhost 클라이언트 모드에 /var/lib/vhost_sockets 를 사용합니다.

7.4.4. 기타 매개변수

NovaSchedulerDefaultFilters
컴퓨팅 노드에서 요청된 게스트 인스턴스의 일치하는 컴퓨팅 노드를 찾는 데 사용하는 순서가 지정된 필터 목록을 제공합니다.
VhostuserSocketGroup
vhost-user 소켓 디렉터리 그룹을 설정합니다. 기본값은 qemu 입니다. ovs-vswitchd 및 qemu 프로세스가 virtio- net 장치를 구성하는 공유 대규모 페이지 및 unix 소켓에 액세스할 수 있도록 VhostuserSocketGrouphugetlbfs 로 설정합니다. 이 값은 역할에 따라 다르며 OVS-DPDK를 활용하는 모든 역할에 적용해야 합니다.
KernelArgs

부팅 시 컴퓨팅 노드의 /etc/default/grub 에 여러 커널 인수를 제공합니다. 구성에 따라 다음 값을 추가합니다.

  • hugepagesz: CPU에서 대규모 페이지 크기를 설정합니다. 이 값은 CPU 하드웨어에 따라 다를 수 있습니다. OVS-DPDK 배포의 경우 1G(default_hugepagesz=1GB hugepagesz=1G)로 설정합니다. 이 명령을 사용하여 CPU가 1G를 지원하는지 확인하는 the pdpe1gb CPU 플래그를 확인합니다.

    lshw -class processor | grep pdpe1gb
  • hugepages 수: 사용 가능한 호스트 메모리를 기반으로 사용 가능한 대규모 페이지 수를 설정합니다. NovaReservedHostMemory 를 제외한 대부분의 사용 가능한 메모리를 사용합니다. 또한 컴퓨팅 노드의 플레이버 내에서 대규모 페이지 수 값을 구성해야 합니다.
  • iommu: Intel CPU의 경우 "intel_iommu=on iommu=pt"를 추가합니다.
  • isolcpus: 튜닝을 위한 CPU 코어 설정. 이 값은 IsolCpusList 와 일치합니다.

CPU 격리에 대한 자세한 내용은 RHEL 8 및 RHEL 9에 대한 Red Hat Knowledgebase 솔루션 OpenStack CPU 격리 지침을참조하십시오.

7.4.5. 인스턴스 추가 사양

NFV 환경에서 인스턴스를 배포하기 전에 CPU 고정, 대규모 페이지 및 에뮬레이터 스레드 고정을 활용하는 플레이버를 만듭니다.

hw:cpu_policy
이 매개 변수가 dedicated 로 설정되면 게스트는 고정된 CPU를 사용합니다. 이 매개 변수 집합을 사용하여 플레이버에서 생성된 인스턴스는 효과적인 과다 할당 비율은 1:1입니다. 기본값은 shared 입니다.
hw:mem_page_size

이 매개변수를 표준 접미사가 있는 특정 값의 유효한 문자열로 설정합니다(예: 4KB,8MB 또는 1GB). 1GB를 사용하여 hugepagesz 부팅 매개 변수와 일치시킵니다. 부팅 매개 변수에서 OvsDpdkSocketMemory 를 제거하여 가상 시스템에 사용할 수 있는 대규모 페이지 수를 계산합니다. 다음 값도 유효합니다.

  • 작은 (기본값) - 가장 작은 페이지 크기가 사용됩니다.
  • Large - 큰 페이지 크기만 사용합니다. (2MB 또는 x86 아키텍처 기반 1GB)
  • 임의의 - 계산 드라이버는 대규모 페이지를 사용할 수 있지만 사용할 수 없는 경우 기본값은 small입니다.
hw:emulator_threads_policy
heat 매개변수인 NovaComputeCpuSharedSet 에서 확인한 CPU로 에뮬레이터 스레드가 잠길 수 있도록 이 매개변수의 값을 공유 하도록 설정합니다. 에뮬레이터 스레드가 폴링 모드 드라이버(PMD) 또는 실시간 처리가 포함된 vCPU에서 실행 중인 경우 패킷 손실과 같이 부정적인 영향을 경험할 수 있습니다.