3장. 성능을 위해 컴퓨팅 노드 구성

클라우드 관리자는 NFV 및 HPC(고성능 컴퓨팅)를 포함한 특수 워크로드를 대상으로 하는 맞춤형 플레이버를 만들어 최적의 성능을 위해 인스턴스의 스케줄링 및 배치를 구성할 수 있습니다.

다음 기능을 사용하여 최적의 성능을 위해 인스턴스를 조정합니다.

  • CPU 고정: 가상 CPU를 물리적 CPU에 고정.
  • 에뮬레이터 스레드: 인스턴스와 연결된 에뮬레이터 스레드를 물리적 CPU에 고정합니다.
  • 대규모 페이지: 일반 메모리(4k 페이지) 및 대규모 페이지(2MB 또는 1GB 페이지)에 대해 인스턴스 메모리 할당 정책을 조정합니다.
참고

이러한 기능을 구성하면 NUMA 토폴로지가 이미 없는 경우 인스턴스에 암시적 NUMA 토폴로지가 생성됩니다.

3.1. 컴퓨팅 노드에서 CPU 고정 구성

컴퓨팅 노드에서 CPU 고정을 활성화하여 전용 호스트 CPU에서 실행되도록 각 인스턴스 CPU 프로세스를 구성할 수 있습니다. 인스턴스에서 CPU 고정을 사용하는 경우 각 인스턴스 vCPU 프로세스에 다른 인스턴스 vCPU 프로세스가 사용할 수 없는 고유한 호스트 pCPU가 할당됩니다. CPU 고정이 활성화된 Compute 노드에서 실행되는 인스턴스에는 NUMA 토폴로지가 있습니다. 인스턴스 NUMA 토폴로지의 각 NUMA 노드는 호스트 Compute 노드의 NUMA 노드에 매핑됩니다.

동일한 컴퓨팅 노드에서 공유(유동) CPU를 사용하여 전용(고정) CPU를 사용하여 인스턴스를 예약하도록 Compute 스케줄러를 구성할 수 있습니다. NUMA 토폴로지가 있는 컴퓨팅 노드에서 CPU 고정을 구성하려면 다음을 완료해야 합니다.

  1. CPU 고정을 위해 컴퓨팅 노드 지정.
  2. 고정 인스턴스 vCPU 프로세스, 유동 인스턴스 vCPU 프로세스 및 호스트 프로세스에 대한 호스트 코어를 예약하도록 계산 노드를 구성합니다.
  3. Overcloud를 배포합니다.
  4. CPU 고정이 필요한 인스턴스를 시작하기 위한 플레이버를 만듭니다.
  5. 공유 또는 유동 CPU를 사용하는 인스턴스를 시작하기 위한 플레이버를 만듭니다.

3.1.1. 사전 요구 사항

  • Compute 노드의 NUMA 토폴로지를 알고 있습니다.

3.1.2. CPU 고정을 위해 컴퓨팅 노드 지정

고정 CPU로 인스턴스에 대해 컴퓨팅 노드를 지정하려면 새 역할 파일을 만들어 CPU 고정 역할을 구성하고, CPU 고정을 위해 사용할 새 오버클라우드 플레이버 및 CPU 고정 리소스 클래스를 구성해야 합니다.

절차

  1. stack 사용자로 언더클라우드에 로그인합니다.
  2. stackrc 파일을 소싱합니다.

    [stack@director ~]$ source ~/stackrc
  3. Controller,Compute 및 Compute CPUPinning 역할이 포함된 roles_data_cpu_pinning.yaml 이라는 새 역할 데이터 파일을 생성합니다.

    (undercloud)$ openstack overcloud roles \
     generate -o /home/stack/templates/roles_data_cpu_pinning.yaml \
     Compute:ComputeCPUPinning Compute Controller
  4. roles_data_cpu_pinning.yaml 을 열고 다음 매개변수 및 섹션을 편집하거나 추가합니다.

    섹션/패랜드현재 값새 값

    역할 설명

    역할: 컴퓨팅

    역할: ComputeCPUPinning

    역할 이름

    name: 컴퓨팅

    name: ComputeCPUPinning

    description

    기본 컴퓨팅 노드 역할

    CPU 고정 컴퓨팅 노드 역할

    HostnameFormatDefault

    %stackname%-novacompute-%index%

    %stackname%-novacomputepinning-%index%

    deprecated_nic_config_name

    compute.yaml

    compute-cpu-pinning.yaml

  5. 노드 정의 템플릿 node. json 또는 node. yaml에 추가하여 오버클라우드의 CPU 고정 컴퓨팅 노드를 등록합니다. 자세한 내용은 Director 설치 및 사용 가이드 의 오버클라우드 노드 등록을 참조하십시오.
  6. 노드 하드웨어를 검사합니다.

    (undercloud)$ openstack overcloud node introspect \
     --all-manageable --provide

    자세한 내용은 Director 설치 및 사용 가이드 의 베어 메탈 노드 하드웨어 인벤토리 생성을 참조하십시오.

  7. CPU 고정 컴퓨팅 노드의 compute-cpu-pinning 오버클라우드 플레이버를 생성합니다.

    (undercloud)$ openstack flavor create --id auto \
     --ram <ram_size_mb> --disk <disk_size_gb> \
     --vcpus <no_vcpus> compute-cpu-pinning
    • <ram_size_mb> 를 베어 메탈 노드의 RAM(MB)으로 바꿉니다.
    • <disk_size_gb> 를 베어 메탈 노드의 디스크 크기(GB)로 바꿉니다.
    • <no_vcpus> 를 베어 메탈 노드의 CPU 수로 바꿉니다.

      참고

      이러한 속성은 인스턴스를 예약하는 데 사용되지 않습니다. 그러나 계산 스케줄러는 디스크 크기를 사용하여 루트 파티션 크기를 결정합니다.

  8. 사용자 정의 CPU 고정 리소스 클래스를 사용하여 CPU 고정을 지정할 각 베어 메탈 노드에 태그를 지정합니다.

    (undercloud)$ openstack baremetal node set \
     --resource-class baremetal.CPU-PINNING <node>

    <node> 를 베어 메탈 노드의 ID로 바꿉니다.

  9. compute-cpu-pinning 플레이버를 사용자 지정 CPU 고정 리소스 클래스와 연결합니다.

    (undercloud)$ openstack flavor set \
     --property resources:CUSTOM_BAREMETAL_CPU_PINNING=1 \
     compute-cpu-pinning

    베어 메탈 서비스 노드의 리소스 클래스에 해당하는 사용자 지정 리소스 클래스의 이름을 확인하려면 리소스 클래스를 대문자로 변환하려면 각 문장 부호 표시를 밑줄로 바꾸고 접두사는 CUSTOM_ 로 바꿉니다.

    참고

    플레이버는 베어 메탈 리소스 클래스의 인스턴스 하나만 요청할 수 있습니다.

  10. Compute 스케줄러가 베어 메탈 플레이버 속성을 사용하여 인스턴스를 예약하지 못하도록 다음 플레이버 속성을 설정합니다.

    (undercloud)$ openstack flavor set \
     --property resources:VCPU=0 \
     --property resources:MEMORY_MB=0 \
     --property resources:DISK_GB=0 compute-cpu-pinning
  11. 선택 사항: ComputeCPUPinning 역할의 네트워크 토폴로지가 Compute 역할의 네트워크 토폴로지와 다른 경우 사용자 지정 네트워크 인터페이스 템플릿을 생성합니다. 자세한 내용은 Advanced Overcloud Customization 가이드의 Custom network interface templates 를 참조하십시오.

    ComputeCPUPinning 역할의 네트워크 토폴로지가 Compute 역할과 동일한 경우 compute.yaml 에 정의된 기본 네트워크 토폴로지를 사용할 수 있습니다.

  12. network-environment.yaml 파일에서 ComputeCPUPinning 역할의 Net::SoftwareConfig 를 등록합니다.

    resource_registry:
      OS::TripleO::Compute::Net::SoftwareConfig: /home/stack/templates/nic-configs/compute.yaml
      OS::TripleO::ComputeCPUPinning::Net::SoftwareConfig: /home/stack/templates/nic-configs/<cpu_pinning_net_top>.yaml
      OS::TripleO::Controller::Net::SoftwareConfig: /home/stack/templates/nic-configs/controller.yaml

    <cpu_pinning_net_top>ComputeCPUPinning 역할의 네트워크 토폴로지가 포함된 파일 이름으로 바꿉니다(예: 기본 네트워크 토폴로지를 사용하려면 compute.yaml ).

  13. 다음 매개변수를 node-info.yaml 파일에 추가하여 CPU 고정 컴퓨팅 노드 수와 CPU 고정 지정된 컴퓨팅 노드에 사용할 플레이버를 지정합니다.

    parameter_defaults:
      OvercloudComputeCPUPinningFlavor: compute-cpu-pinning
      ComputeCPUPinningCount: 3
  14. 역할이 생성되었는지 확인하려면 다음 명령을 입력합니다.

    (undercloud)$ openstack baremetal node list --long -c "UUID" \
     -c "Instance UUID" -c "Resource Class" -c "Provisioning State" \
     -c "Power State" -c "Last Error" -c "Fault" -c "Name" -f json

    출력 예:

    [
      {
        "Fault": null,
        "Instance UUID": "e8e60d37-d7c7-4210-acf7-f04b245582ea",
        "Last Error": null,
        "Name": "compute-0",
        "Power State": "power on",
        "Provisioning State": "active",
        "Resource Class": "baremetal.CPU-PINNING",
        "UUID": "b5a9ac58-63a7-49ba-b4ad-33d84000ccb4"
      },
      {
        "Fault": null,
        "Instance UUID": "3ec34c0b-c4f5-4535-9bd3-8a1649d2e1bd",
        "Last Error": null,
        "Name": "compute-1",
        "Power State": "power on",
        "Provisioning State": "active",
        "Resource Class": "compute",
        "UUID": "432e7f86-8da2-44a6-9b14-dfacdf611366"
      },
      {
        "Fault": null,
        "Instance UUID": "4992c2da-adde-41b3-bef1-3a5b8e356fc0",
        "Last Error": null,
        "Name": "controller-0",
        "Power State": "power on",
        "Provisioning State": "active",
        "Resource Class": "controller",
        "UUID": "474c2fc8-b884-4377-b6d7-781082a3a9c0"
      }
    ]

3.1.3. CPU 고정을 위한 컴퓨팅 노드 구성

노드의 NUMA 토폴로지를 기반으로 Compute 노드에서 CPU 고정을 구성합니다. 호스트 프로세스의 효율성을 위해 모든 NUMA 노드에서 일부 CPU 코어를 예약합니다. 나머지 CPU 코어를 인스턴스 관리에 할당합니다.

이 절차에서는 CPU 고정 구성 방법을 설명하기 위해 8개의 CPU 코어가 2개의 NUMA 노드에 분산되어 있는 다음 NUMA 토폴로지를 사용합니다.

표 3.1. NUMA 토폴로지 예

NUMA 노드 0

NUMA 노드 1

코어 0

코어 1

코어 2

코어 3

코어 4

코어 5

코어 6

코어 7

이 절차에서는 코어 0 및 4를 호스트 프로세스, 코어 1, 3, 5, 7을 CPU 고정이 필요한 인스턴스에 대해 예약하고, CPU 고정이 필요하지 않은 유동 인스턴스에 대해 코어 2 및 6을 예약합니다.

절차

  1. 환경 파일을 만들어 고정된 인스턴스, 유동 인스턴스 및 호스트 프로세스(예: cpu_pinning.yaml )의 코어를 예약하도록 컴퓨팅 노드를 구성합니다.
  2. NUMA 사용 가능한 Compute 노드에 NUMA 토폴로지를 사용하여 인스턴스를 예약하려면 아직 없는 경우 Compute 환경 파일의 NovaSchedulerDefaultFilter 매개변수에 NUMATopology Filter를 추가합니다.

    parameter_defaults:
      NovaSchedulerDefaultFilters: ['AvailabilityZoneFilter','ComputeFilter','ComputeCapabilitiesFilter','ImagePropertiesFilter','ServerGroupAntiAffinityFilter','ServerGroupAffinityFilter','PciPassthroughFilter','NUMATopologyFilter']

    NUMATopologyFilter 에 대한 자세한 내용은 Compute Scheduler filters를 참조하십시오.

  3. 전용 인스턴스의 물리적 CPU 코어를 예약하려면 cpu_pinning.yaml에 다음 구성을 추가합니다.

    parameter_defaults:
      ComputeCPUPinningParameters:
        NovaComputeCpuDedicatedSet: 1,3,5,7
  4. 공유 인스턴스의 물리적 CPU 코어를 예약하려면 cpu_pinning.yaml에 다음 구성을 추가합니다.

    parameter_defaults:
      ComputeCPUPinningParameters:
        ...
        NovaComputeCpuSharedSet: 2,6
  5. 호스트 프로세스에 예약할 RAM 크기를 지정하려면 cpu_pinning.yaml에 다음 설정을 추가합니다.

    parameter_defaults:
      ComputeCPUPinningParameters:
        ...
        NovaReservedHostMemory: <ram>

    <ram> 을 MB로 예약할 RAM 양으로 바꿉니다.

  6. 호스트 프로세스가 인스턴스에 예약된 CPU 코어에서 실행되지 않도록 하려면 IsolCpusList 매개변수를 인스턴스에 예약한 CPU 코어로 설정합니다.

    parameter_defaults:
      ComputeCPUPinningParameters:
        ...
        IsolCpusList: 1-3,5-7

    쉼표로 구분된 CPU 인덱스의 목록 또는 범위를 사용하여 IsolCpusList 매개변수 값을 지정합니다.

  7. 다른 환경 파일을 사용하여 스택에 새 역할 및 환경 파일을 추가하고 오버클라우드를 배포합니다.

    (undercloud)$ openstack overcloud deploy --templates \
      -e [your environment files] \
      -r /home/stack/templates/roles_data_cpu_pinning.yaml \
      -e /home/stack/templates/network-environment.yaml \
      -e /home/stack/templates/cpu_pinning.yaml \
      -e /home/stack/templates/node-info.yaml

3.1.4. 인스턴스의 전용 CPU 플레이버 생성

클라우드 사용자가 전용 CPU가 있는 인스턴스를 만들 수 있도록 하려면 인스턴스를 시작하기 위한 전용 CPU 정책으로 플레이버를 만들 수 있습니다.

사전 요구 사항

  • 호스트에서 동시 멀티스레딩(SMT)이 활성화됩니다.
  • 컴퓨팅 노드는 CPU 고정을 허용하도록 구성되어 있습니다. 자세한 내용은 Compute 노드에서 CPU 고정 구성을 참조하십시오.

절차

  1. overcloudrc 파일을 소싱합니다.

    (undercloud)$ source ~/overcloudrc
  2. CPU 고정이 필요한 인스턴스의 플레이버를 생성합니다.

    (overcloud)$ openstack flavor create --ram <size_mb> \
     --disk <size_gb> --vcpus <no_reserved_vcpus> pinned_cpus
  3. 고정된 CPU를 요청하려면 플레이버의 hw:cpu_policy 속성을 전용으로 설정합니다.

    (overcloud)$ openstack flavor set \
     --property hw:cpu_policy=dedicated pinned_cpus
  4. 스레드 시블링에 각 vCPU를 배치하려면 다음을 요구 하도록 플레이버의 hw:cpu_thread_policy 속성을 설정합니다.

    (overcloud)$ openstack flavor set \
     --property hw:cpu_thread_policy=require pinned_cpus
    참고
    • 호스트에 SMT 아키텍처 또는 사용 가능한 스레드 스레딩이 충분한 CPU 코어가 없는 경우 예약에 실패합니다. 이를 방지하려면 require 대신 hw:cpu_thread_policyprefer 로 설정합니다. prefer 정책은 사용 가능한 경우 스레드를 사용하도록 하는 기본 정책입니다.
    • hw:cpu_thread_policy=isolate 을 사용하는 경우 SMT를 비활성화하거나 SMT를 지원하지 않는 플랫폼을 사용해야 합니다.

검증

  1. 플레이버가 전용 CPU가 있는 인스턴스를 생성하는지 확인하려면 새 플레이버를 사용하여 인스턴스를 시작합니다.

    (overcloud)$ openstack server create --flavor pinned_cpus \
     --image <image> pinned_cpu_instance
  2. 새 인스턴스의 올바른 배치를 확인하려면 다음 명령을 입력하고 출력에 OS-EXT-SRV-ATTR:hypervisor_hostname 을 확인합니다.

    (overcloud)$ openstack server show pinned_cpu_instance

3.1.5. 인스턴스의 공유 CPU 플레이버 생성

클라우드 사용자가 공유 또는 유동 CPU를 사용하는 인스턴스를 만들 수 있도록 하려면 공유 CPU 정책으로 플레이버를 만들어 인스턴스를 시작할 수 있습니다.

사전 요구 사항

절차

  1. overcloudrc 파일을 소싱합니다.

    (undercloud)$ source ~/overcloudrc
  2. CPU 고정이 필요하지 않은 인스턴스의 플레이버를 생성합니다.

    (overcloud)$ openstack flavor create --ram <size_mb> \
     --disk <size_gb> --vcpus <no_reserved_vcpus> floating_cpus
  3. 유동 CPU를 요청하려면 플레이버의 hw:cpu_policy 속성을 shared 로 설정합니다.

    (overcloud)$ openstack flavor set \
     --property hw:cpu_policy=shared floating_cpus

검증

  1. 플레이버가 공유 CPU를 사용하는 인스턴스를 생성하는지 확인하려면 새 플레이버를 사용하여 인스턴스를 시작합니다.

    (overcloud)$ openstack server create --flavor floating_cpus \
     --image <image> floating_cpu_instance
  2. 새 인스턴스의 올바른 배치를 확인하려면 다음 명령을 입력하고 출력에 OS-EXT-SRV-ATTR:hypervisor_hostname 을 확인합니다.

    (overcloud)$ openstack server show floating_cpu_instance

3.1.6. SMT(동시 멀티스레딩)를 사용하여 컴퓨팅 노드에서 CPU 고정 구성

컴퓨팅 노드가 SMT(동시 멀티스레딩)를 지원하는 경우 전용 또는 공유 집합에 그룹 스레드를 함께 사용합니다. 스레드 스레딩은 몇 가지 일반적인 하드웨어를 공유하므로 한 스레드 시블링에서 프로세스를 실행하여 다른 스레드 스레딩의 성능에 영향을 줄 수 있습니다.

예를 들어 호스트는 SMT가 있는 듀얼 코어 CPU에서 4개의 논리적 CPU 코어를 식별합니다. 0, 1, 2 및 3. 이 4개 중 두 쌍의 스레드 시블링이 있습니다.

  • 스레드 시블링 1: 논리 CPU 코어 0 및 2
  • 스레드 시블링 2: 논리 CPU 코어 1 및 3

이 시나리오에서는 논리 CPU 코어 0과 1을 전용으로 할당하지 말고 2 및 3을 공유로 할당하지 마십시오. 대신 0과 2를 전용으로 할당하고 1 및 3을 공유로 할당합니다.

파일 /sys/devices/system/cpu/cpuN/topology/thread_siblings_list 여기서 N 은 논리 CPU 번호이며 스레드 쌍을 포함합니다. 다음 명령을 사용하여 스레드 에이전트인 논리적 CPU 코어를 식별할 수 있습니다.

# grep -H . /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | sort -n -t ':' -k 2 -u

다음 출력은 논리 CPU 코어 0 및 논리적 CPU 코어 2가 동일한 코어의 스레드임을 나타냅니다.

/sys/devices/system/cpu/cpu0/topology/thread_siblings_list:0,2
/sys/devices/system/cpu/cpu2/topology/thread_siblings_list:1,3

3.1.7. 추가 리소스