9.2. ovs-DPDK 매개변수
이 섹션에서는 OVS-DPDK가 director network_environment.yaml
heat 템플릿 내에서 매개변수를 사용하여 최대 성능을 위해 CPU 및 메모리를 구성하는 방법을 설명합니다. 이 정보를 사용하여 컴퓨팅 노드의 하드웨어 지원과 OVS-DPDK 배포를 최적화하기 위해 하드웨어를 분할하는 방법을 평가합니다.
CPU 코어를 할당할 때 항상 CPU 형제 스레드 또는 논리 CPU를 물리적 코어에 결합합니다.
컴퓨팅 노드에서 CPU 및 NUMA 노드를 결정하는 방법에 대한 자세한 내용은 NUMA 노드 토폴로지 검색을 참조하십시오. 이 정보를 사용하여 CPU 및 기타 매개변수를 매핑하여 호스트, 게스트 인스턴스 및 OVS-DPDK 프로세스 요구 사항을 지원합니다.
9.2.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 코어 세트.
IsolCpusList
는tuned-profiles-cpu-partitioning
구성 요소의cpu-partitioning-variable.conf
파일의isolated_cores
값입니다.IsolCpusList
에 대해 다음 권장 사항을 사용하십시오.-
OvsPmdCoreList
및NovaComputeCpuDedicatedSet
의 코어 목록을 일치시킵니다. - 형제 스레드를 페어링합니다.
-
- DerivePciWhitelistEnabled
VM의 VF(가상 기능)를 예약하려면
NovaPCIPassthrough
매개변수를 사용하여 Nova에 전달되는 VF 목록을 생성합니다. 목록에서 제외된 VFS는 호스트에서 계속 사용할 수 있습니다.목록의 각 VF에 대해 address 매개변수를 address 값으로 확인하는 정규식으로 채웁니다.
다음은 수동 목록 생성 프로세스의 예입니다.
eno2
라는 장치에서 NIC 파티셔닝이 활성화된 경우 다음 명령을 사용하여 VF의 PCI 주소를 나열합니다.[tripleo-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
에서 사용됩니다. 다음 예와 같이 VFs 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]"}
9.2.2. 메모리 매개변수
OVS-DPDK는 다음 메모리 매개변수를 사용합니다.
- OvsDpdkMemoryChannels
NUMA 노드당 CPU에 메모리 채널을 매핑합니다. OVS의
OvsDpdkMemoryChannels
는 OVS의other_config:dpdk-extra="-n <value>"
값입니다.OvsDpdkMemoryChannels
에 대한 다음 권장 사항을 확인하십시오.-
dmidecode -t 메모리
또는 하드웨어 설명서를 사용하여 사용 가능한 메모리 채널 수를 확인합니다. -
ls /sys/devices/system/node/node* -d
를 사용하여 NUMA 노드 수를 확인합니다. - 사용 가능한 메모리 채널 수를 NUMA 노드 수로 나눕니다.
-
- NovaReservedHostMemory
호스트의 작업에 대해 메모리(MB)를 예약합니다.
NovaReservedHostMemory
는nova.conf
의 컴퓨팅 노드의reserved_host_memory_mb
값입니다.NovaReservedHostMemory
에 대한 다음 권장 사항을 확인하십시오.- 정적 권장 값 4096MB를 사용합니다.
- OvsDpdkSocketMemory
NUMA 노드별로 hugepage 풀에서 사전 할당하기 위한 메모리 양(MB)을 지정합니다.
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 NIC dpdk0 및 dpdk1은 각각 동일한 NUMA 노드 0에 있으며 MTU 9000 및 2000으로 구성됩니다. 필요한 메모리를 파생하기 위한 샘플 계산은 다음과 같습니다.
MTU 값을 1024바이트의 가장 가까운 배수로 반올림합니다.
The MTU value of 9000 becomes 9216 bytes. The MTU value of 2000 becomes 2048 bytes.
이러한 반올림된 바이트 값을 기반으로 각 MTU 값에 필요한 메모리를 계산합니다.
Memory required for 9000 MTU = (9216 + 800) * (4096*64) = 2625634304 Memory required for 2000 MTU = (2048 + 800) * (4096*64) = 746586112
필요한 총 메모리(바이트)를 계산합니다.
2625634304 + 746586112 + 536870912 = 3909091328 bytes.
이 계산은 ( 9000의 MTU에 필요한 메모리) + (2000의 MTU에 메모리 필요) + (512MB 버퍼)를 나타냅니다.
필요한 총 메모리를 MB로 변환합니다.
3909091328 / (1024*1024) = 3728 MB.
이 값을 가장 가까운 1024까지 반올림합니다.
3724 MB rounds up to 4096 MB.
이 값을 사용하여
OvsDpdkSocketMemory
를 설정합니다.OvsDpdkSocketMemory: "4096,1024"
샘플 계산 - MTU 2000
DPDK NIC dpdk0 및 dpdk1은 동일한 NUMA 노드 0에 있으며 각각 2000의 MTU로 구성됩니다. 필요한 메모리를 파생하기 위한 샘플 계산은 다음과 같습니다.
MTU 값을 1024바이트의 가장 가까운 배수로 반올림합니다.
The MTU value of 2000 becomes 2048 bytes.
이러한 반올림된 바이트 값을 기반으로 각 MTU 값에 필요한 메모리를 계산합니다.
Memory required for 2000 MTU = (2048 + 800) * (4096*64) = 746586112
필요한 총 메모리(바이트)를 계산합니다.
746586112 + 536870912 = 1283457024 bytes.
이 계산은 (2000의 MTU에 필요한 메모리) + (512MB 버퍼)를 나타냅니다.
필요한 총 메모리를 MB로 변환합니다.
1283457024 / (1024*1024) = 1224 MB.
이 값을 1024의 가장 가까운 배수로 반올림합니다.
1224 MB rounds up to 2048 MB.
이 값을 사용하여
OvsDpdkSocketMemory
를 설정합니다.OvsDpdkSocketMemory: "2048,1024"
9.2.3. 네트워킹 매개변수
- OvsDpdkDriverType
-
DPDK에서 사용하는 드라이버 유형을 설정합니다.
vfio-pci
의 기본값을 사용합니다. - NeutronDatapathType
-
OVS 브리지의 datapath 유형입니다. DPDK는
netdev
의 기본값을 사용합니다. - NeutronVhostuserSocketDir
-
OVS의 vhost-user 소켓 디렉터리를 설정합니다. vhost 클라이언트 모드에
/var/lib/vhost_sockets
를 사용합니다.
9.2.4. 기타 매개변수
- NovaSchedulerEnabledFilters
- 컴퓨팅 노드에서 요청된 게스트 인스턴스에 대해 일치하는 컴퓨팅 노드를 찾는 데 사용하는 정렬된 필터 목록을 제공합니다.
- VhostuserSocketGroup
vhost-user 소켓 디렉터리 그룹을 설정합니다. 기본값은
qemu
입니다.ovs-vswitchd
및qemu
프로세스가 virtio-net 장치를 구성하는 공유 대규모 페이지 및 unix 소켓에 액세스할 수 있도록VhostuserSocketGroup
을hugetlbfs
로 설정합니다. 이 값은 역할별로 고유하며 OVS-DPDK를 활용하는 모든 역할에 적용해야 합니다.중요VhostuserSocketGroup
매개변수를 사용하려면NeutronVhostuserSocketDir
도 설정해야 합니다. 자세한 내용은 9.2.3절. “네트워킹 매개변수”의 내용을 참조하십시오.- KernelArgs
부팅 시 컴퓨팅 노드의
/etc/default/grub
에 여러 커널 인수를 제공합니다. 구성에 따라 다음 값을 추가합니다.hugepagesz
: CPU에 대규모 페이지 크기를 설정합니다. 이 값은 CPU 하드웨어에 따라 다를 수 있습니다. OVS-DPDK 배포용 1G(default_hugepagesz=1GB hugepagesz=1G
)로 설정합니다. 이 명령을 사용하여 CPU가 1G를 지원하는지 확인하는pdpe1gb
CPU 플래그를 확인합니다.lshw -class processor | grep pdpe1gb
-
hugepages count
: 사용 가능한 호스트 메모리를 기반으로 사용 가능한 대규모 페이지 수를 설정합니다.NovaReservedHostMemory
를 제외하고 사용 가능한 대부분의 메모리를 사용합니다. 컴퓨팅 노드의 플레이버 내에서 대규모 페이지 수 값을 구성해야 합니다. -
iommu
: For Intel CPUs, add"intel_iommu=on iommu=pt"
-
isolcpus
: 튜닝을 위해 CPU 코어를 설정합니다. 이 값은IsolCpusList
와 일치합니다.
CPU 분리에 대한 자세한 내용은 RHEL 8 및 RHEL 9의 Red Hat Knowledgebase 솔루션 OpenStack CPU 격리 지침을 참조하십시오.
- DdpPackage
배포의 장치에 프로필 패키지를 적용하여 장치의 패킷 처리 파이프라인을 변경하도록 DDP(Dynamic Device Personalization)를 구성합니다. DDP 패키지를 포함하도록 network_environment.yaml 템플릿에 다음 행을 추가합니다.
parameter_defaults: ComputeOvsDpdkSriovParameters: DdpPackage: "ddp-comms"
9.2.5. VM 인스턴스 플레이버 사양
NFV 환경에 VM 인스턴스를 배포하기 전에 CPU 고정, 대규모 페이지 및 에뮬레이터 스레드 고정을 사용하는 플레이버를 생성합니다.
- hw:cpu_policy
-
이 매개변수가
dedicated
로 설정된 경우 게스트는 고정된 CPU를 사용합니다. 이 매개변수 세트를 사용하여 플레이버에서 생성된 인스턴스의 오버 커밋 비율은 1:1입니다. 기본값은shared
입니다. - hw:mem_page_size
이 매개변수를 표준 접미사가 있는 특정 값의 유효한 문자열(예:
4KB
,8MB
또는1GB
)으로 설정합니다.hugepagesz
부팅 매개변수와 일치하도록 1GB를 사용합니다. 부팅 매개변수에서OvsDpdkSocketMemory
를 제거하여 가상 머신에 사용할 수 있는 대규모 페이지 수를 계산합니다. 다음 값도 유효합니다.- small(기본값) - 가장 작은 페이지 크기가 사용됩니다.
- large - 대용량 페이지 크기만 사용합니다. (2MB 또는 1GB x86 아키텍처의 경우)
- 모든 - 컴퓨팅 드라이버는 대규모 페이지를 사용하려고 시도할 수 있지만 사용할 수 없는 경우 기본값은 small입니다.
- hw:emulator_threads_policy
-
이 매개변수의 값을
공유하여
에뮬레이터 스레드가 heat 매개변수NovaComputeCpuSharedSet
에서 식별한 CPU에 고정되도록 설정합니다. 에뮬레이터 스레드가 폴링 모드 드라이버(PMD) 또는 실시간 처리가 있는 vCPU에서 실행 중인 경우 패킷 손실과 같은 부정적인 영향을 미칠 수 있습니다.