3.3. 컴퓨팅 노드에서 Huge Page 구성
클라우드 관리자는 인스턴스가 대규모 페이지를 요청할 수 있도록 컴퓨팅 노드를 구성할 수 있습니다.
절차
- 컴퓨팅 환경 파일을 엽니다.
각 NUMA 노드에서 인스턴스가 아닌 프로세스를 예약하도록 대규모 페이지 메모리의 양을 구성합니다.
parameter_defaults: ComputeParameters: NovaReservedHugePages: ["node:0,size:1GB,count:1","node:1,size:1GB,count:1"]
각 노드의
크기
값을 할당된 대규모 페이지의 크기로 바꿉니다. 다음 유효한 값 중 하나로 설정합니다.- 2048 (2MB의 경우)
- 1GB
-
각 노드의
개수
값을 NUMA 노드당 OVS에서 사용하는 대규모 페이지 수로 바꿉니다. 예를 들어 Open vSwitch에서 사용하는 소켓 메모리 4096의 경우 이 값을 2로 설정합니다.
컴퓨팅 노드에서 대규모 페이지를 구성합니다.
parameter_defaults: ComputeParameters: ... KernelArgs: "default_hugepagesz=1GB hugepagesz=1G hugepages=32"
참고여러 대규모 페이지 크기를 구성하는 경우 첫 번째 부팅 중에 대규모 페이지 폴더를 마운트해야 합니다. 자세한 내용은 처음 부팅할 때 여러 대규모 페이지 폴더 마운트를 참조하십시오.
선택 사항: 인스턴스가 1GB대 페이지를 할당할 수 있도록 CPU 기능 플래그
NovaLibvirtCPUModelExtraFlags
를 includepdpe1gb
로 구성합니다.parameter_defaults: ComputeParameters: NovaLibvirtCPUMode: 'custom' NovaLibvirtCPUModels: 'Haswell-noTSX' NovaLibvirtCPUModelExtraFlags: 'vmx, pdpe1gb'
참고- 인스턴스가 2MB의 대규모 페이지만 요청할 수 있도록 CPU 기능 플래그를 구성할 필요는 없습니다.
- 호스트가 1G 대규모 페이지 할당을 지원하는 경우에만 인스턴스에 1G 대규모 페이지를 할당할 수 있습니다.
-
NovaLibvirtCPUMode가
tohost-model
또는custom
로 설정된 경우NovaLibvirtCPUMode를 NovaLibvirtCPU
ModelExtraFlagspdpe1gb
만 설정하면 됩니다. -
호스트 support
pdpe1gb
및host-passthrough
가NovaLibvirtCPUMode
로 사용되는 경우 setpdpe1gb
를NovaLibvirtCPUModelExtraFlags
로 사용할 필요가 없습니다. Thepdpe1gb
플래그는 Opteron_G4 및 Opteron_G5 CPU 모델에만 포함되어 있으며 QEMU에서 지원하는 Intel CPU 모델에 포함되지 않습니다. - MDS(Microarchitectural Data Sampling)와 같은 CPU 하드웨어 문제를 완화하려면 다른 CPU 플래그를 구성해야 할 수 있습니다. 자세한 내용은 RHOS Mitigation for MDS("Microarchitectural Data Sampling") 보안 결함을 참조하십시오.
Meltdown 보호를 적용한 후 성능 손실을 방지하려면
+pcid
를 포함하도록NovaLibvirtCPUModelExtraFlags
CPU 기능 플래그를 구성합니다.parameter_defaults: ComputeParameters: NovaLibvirtCPUMode: 'custom' NovaLibvirtCPUModels: 'Haswell-noTSX' NovaLibvirtCPUModelExtraFlags: 'vmx, pdpe1gb, +pcid'
작은 정보자세한 내용은 "PCID" CPU 기능 플래그를 사용하여 OpenStack 게스트의 Meltdown CVE 픽스 성능에 미치는 영향 감소를 참조하십시오.
-
아직 없는 경우
NovaSchedulerDefaultFilters
매개변수에 NUMATopology 다른 환경 파일을 사용하여 스택에 Compute 환경 파일을 추가하고 오버클라우드를 배포합니다.
(undercloud)$ openstack overcloud deploy --templates \ -e [your environment files] \ -e /home/stack/templates/<compute_environment_file>.yaml
3.3.1. 인스턴스의 대규모 페이지 플레이버 생성
클라우드 사용자가 대규모 페이지를 사용하는 인스턴스를 생성할 수 있도록 하려면 인스턴스를 시작하기 위한 hw:mem_page_size
추가 사양 키로 플레이버를 생성할 수 있습니다.
사전 요구 사항
- 컴퓨팅 노드는 대규모 페이지에 대해 구성됩니다. 자세한 내용은 컴퓨팅 노드에서 대규모 페이지 구성을 참조하십시오.
절차
대규모 페이지가 필요한 인스턴스의 플레이버를 생성합니다.
$ openstack flavor create --ram <size_mb> --disk <size_gb> \ --vcpus <no_reserved_vcpus> huge_pages
대규모 페이지를 요청하려면 플레이버의
hw:mem_page_size
속성을 필수 크기로 설정합니다.$ openstack flavor set huge_pages --property hw:mem_page_size=1GB
다음 유효한 값 중 하나로
hw:mem_page_size
를 설정합니다.-
Large
- 호스트에서 지원되는 가장 큰 페이지 크기를 선택합니다. 이 크기는 x86_64 시스템에서 2MB 또는 1GB일 수 있습니다. -
small
- (기본값) 호스트에서 지원되는 최소 페이지 크기를 선택합니다. x86_64 시스템에서는 4 kB(일반 페이지)입니다. -
any
- libvirt 드라이버가 결정한 대로 사용 가능한 가장 큰 대규모 페이지 크기를 선택합니다. - <pagesize>: (문자열) 워크로드에 특정 요구 사항이 있는 경우 명시적 페이지 크기를 설정합니다. 페이지 크기(KB) 또는 표준 접미사에 정수 값을 사용합니다. 예를 들면 다음과 같습니다. 4KB, 2MB, 2048, 1GB.
-
플레이버가 대규모 페이지가 있는 인스턴스를 생성하는지 확인하려면 새 플레이버를 사용하여 인스턴스를 시작합니다.
$ openstack server create --flavor huge_pages \ --image <image> huge_pages_instance
계산 스케줄러는 인스턴스의 메모리를 백업하는 데 필요한 크기의 사용 가능한 대규모 페이지가 충분한 호스트를 식별합니다. 스케줄러가 충분한 페이지가 있는 호스트 및 NUMA 노드를 찾을 수 없는 경우 요청이
NoValidHost
오류로 인해 실패합니다.
3.3.2. 첫 번째 부팅 중에 여러 개의 대규모 페이지 폴더 마운트
첫 번째 부팅 프로세스의 일부로 여러 페이지 크기를 처리하도록 Compute 서비스(nova)를 구성할 수 있습니다. 첫 번째 부팅 프로세스는 노드를 처음 부팅할 때 모든 노드에 heat 템플릿 설정을 추가합니다. 오버클라우드 스택 업데이트와 같은 이러한 템플릿이 나중에 포함되면 이러한 스크립트가 실행되지 않습니다.
절차
스크립트를 실행하여 대규모 페이지 폴더에 대한 마운트를 생성하는 첫 번째 부팅 템플릿 파일
hugepages.yaml
을 생성합니다.OS::TripleO::MultipartMime
리소스 유형을 사용하여 구성 스크립트를 보낼 수 있습니다.heat_template_version: <version> description: > Huge pages configuration resources: userdata: type: OS::Heat::MultipartMime properties: parts: - config: {get_resource: hugepages_config} hugepages_config: type: OS::Heat::SoftwareConfig properties: config: | #!/bin/bash hostname | grep -qiE 'co?mp' || exit 0 systemctl mask dev-hugepages.mount || true for pagesize in 2M 1G;do if ! [ -d "/dev/hugepages${pagesize}" ]; then mkdir -p "/dev/hugepages${pagesize}" cat << EOF > /etc/systemd/system/dev-hugepages${pagesize}.mount [Unit] Description=${pagesize} Huge Pages File System Documentation=https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt Documentation=https://www.freedesktop.org/wiki/Software/systemd/APIFileSystems DefaultDependencies=no Before=sysinit.target ConditionPathExists=/sys/kernel/mm/hugepages ConditionCapability=CAP_SYS_ADMIN ConditionVirtualization=!private-users [Mount] What=hugetlbfs Where=/dev/hugepages${pagesize} Type=hugetlbfs Options=pagesize=${pagesize} [Install] WantedBy = sysinit.target EOF fi done systemctl daemon-reload for pagesize in 2M 1G;do systemctl enable --now dev-hugepages${pagesize}.mount done outputs: OS::stack_id: value: {get_resource: userdata}
이 템플릿의
구성
스크립트는 다음 작업을 수행합니다.-
'co?mp'
와 일치하는 호스트 이름을 지정하여 대규모 페이지 폴더에 대한 마운트를 생성하도록 호스트를 필터링합니다. 필요에 따라 특정 계산에 대해 필터 grep 패턴을 업데이트할 수 있습니다. -
기본
dev-hugepages.mount systemd
장치 파일을 연결하여 페이지 크기를 사용하여 새 마운트를 생성할 수 있도록 합니다. - 폴더가 먼저 생성되었는지 확인합니다.
-
각
pagesize
에 대해systemd
마운트 단위를 생성합니다. -
첫 번째 루프 후에
systemd daemon-reload
를 실행하여 새로 생성된 장치 파일을 포함합니다. - 2M 및 1G 페이지 크기에 대한 각 마운트를 활성화합니다. 필요에 따라 추가 페이지 크기를 포함하도록 이 루프를 업데이트할 수 있습니다.
-
선택 사항:
/dev
폴더는nova_compute
및nova_libvirt
컨테이너에 자동으로 바인딩됩니다. 대규모 페이지 마운트에 다른 대상을 사용한 경우,nova_compute
및nova_libvirt
컨테이너에 마운트를 전달해야 합니다.parameter_defaults NovaComputeOptVolumes: - /opt/dev:/opt/dev NovaLibvirtOptVolumes: - /opt/dev:/opt/dev
~/templates/firstboot.yaml
환경 파일에OS::TripleO::NodeUserData
리소스 유형으로 heat 템플릿을 등록합니다.resource_registry: OS::TripleO::NodeUserData: ./hugepages.yaml
중요NodeUserData
리소스를 각 리소스에 대해 하나의 heat 템플릿에만 등록할 수 있습니다. 후속 사용은 사용할 heat 템플릿을 덮어씁니다.첫 번째 부팅 환경 파일을 다른 환경 파일과 함께 스택에 추가하고 오버클라우드를 배포합니다.
(undercloud)$ openstack overcloud deploy --templates \ -e [your environment files] \ -e /home/stack/templates/firstboot.yaml \ ...