3.3. 컴퓨팅 노드에서 Huge Page 구성

클라우드 관리자는 인스턴스가 대규모 페이지를 요청할 수 있도록 컴퓨팅 노드를 구성할 수 있습니다.

절차

  1. 컴퓨팅 환경 파일을 엽니다.
  2. 각 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로 설정합니다.
  3. 컴퓨팅 노드에서 대규모 페이지를 구성합니다.

    parameter_defaults:
      ComputeParameters:
        ...
        KernelArgs: "default_hugepagesz=1GB hugepagesz=1G hugepages=32"
    참고

    여러 대규모 페이지 크기를 구성하는 경우 첫 번째 부팅 중에 대규모 페이지 폴더를 마운트해야 합니다. 자세한 내용은 처음 부팅할 때 여러 대규모 페이지 폴더 마운트를 참조하십시오.

  4. 선택 사항: 인스턴스가 1GB대 페이지를 할당할 수 있도록 CPU 기능 플래그 NovaLibvirtCPUModelExtraFlags 를 include pdpe1gb 로 구성합니다.

    parameter_defaults:
      ComputeParameters:
        NovaLibvirtCPUMode: 'custom'
        NovaLibvirtCPUModels: 'Haswell-noTSX'
        NovaLibvirtCPUModelExtraFlags: 'vmx, pdpe1gb'
    참고
    • 인스턴스가 2MB의 대규모 페이지만 요청할 수 있도록 CPU 기능 플래그를 구성할 필요는 없습니다.
    • 호스트가 1G 대규모 페이지 할당을 지원하는 경우에만 인스턴스에 1G 대규모 페이지를 할당할 수 있습니다.
    • NovaLibvirtCPUMode가 host-model 또는 custom 로 설정된 경우 NovaLibvirtCPUMode를 NovaLibvirtCPU ModelExtraFlags to pdpe1gb 만 설정하면 됩니다.
    • 호스트 support pdpe1gbhost-passthroughNovaLibvirtCPUMode 로 사용되는 경우 set pdpe1gbNovaLibvirtCPUModelExtraFlags 로 사용할 필요가 없습니다. The pdpe1gb 플래그는 Opteron_G4 및 Opteron_G5 CPU 모델에만 포함되어 있으며 QEMU에서 지원하는 Intel CPU 모델에 포함되지 않습니다.
    • MDS(Microarchitectural Data Sampling)와 같은 CPU 하드웨어 문제를 완화하려면 다른 CPU 플래그를 구성해야 할 수 있습니다. 자세한 내용은 RHOS Mitigation for MDS("Microarchitectural Data Sampling") 보안 결함을 참조하십시오.
  5. Meltdown 보호를 적용한 후 성능 손실을 방지하려면 +pcid 를 포함하도록 NovaLibvirtCPUModelExtraFlags CPU 기능 플래그를 구성합니다.

    parameter_defaults:
      ComputeParameters:
        NovaLibvirtCPUMode: 'custom'
        NovaLibvirtCPUModels: 'Haswell-noTSX'
        NovaLibvirtCPUModelExtraFlags: 'vmx, pdpe1gb, +pcid'
  6. 아직 없는 경우 NovaSchedulerDefaultFilters 매개변수에 NUMATopology Filter를 추가합니다.
  7. 다른 환경 파일을 사용하여 스택에 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 추가 사양 키로 플레이버를 생성할 수 있습니다.

사전 요구 사항

절차

  1. 대규모 페이지가 필요한 인스턴스의 플레이버를 생성합니다.

    $ openstack flavor create --ram <size_mb> --disk <size_gb> \
     --vcpus <no_reserved_vcpus> huge_pages
  2. 대규모 페이지를 요청하려면 플레이버의 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.
  3. 플레이버가 대규모 페이지가 있는 인스턴스를 생성하는지 확인하려면 새 플레이버를 사용하여 인스턴스를 시작합니다.

    $ openstack server create --flavor huge_pages \
     --image <image> huge_pages_instance

    계산 스케줄러는 인스턴스의 메모리를 백업하는 데 필요한 크기의 사용 가능한 대규모 페이지가 충분한 호스트를 식별합니다. 스케줄러가 충분한 페이지가 있는 호스트 및 NUMA 노드를 찾을 수 없는 경우 요청이 NoValidHost 오류로 인해 실패합니다.

3.3.2. 첫 번째 부팅 중에 여러 개의 대규모 페이지 폴더 마운트

첫 번째 부팅 프로세스의 일부로 여러 페이지 크기를 처리하도록 Compute 서비스(nova)를 구성할 수 있습니다. 첫 번째 부팅 프로세스는 노드를 처음 부팅할 때 모든 노드에 heat 템플릿 설정을 추가합니다. 오버클라우드 스택 업데이트와 같은 이러한 템플릿이 나중에 포함되면 이러한 스크립트가 실행되지 않습니다.

절차

  1. 스크립트를 실행하여 대규모 페이지 폴더에 대한 마운트를 생성하는 첫 번째 부팅 템플릿 파일 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}

    이 템플릿의 구성 스크립트는 다음 작업을 수행합니다.

    1. 'co?mp' 와 일치하는 호스트 이름을 지정하여 대규모 페이지 폴더에 대한 마운트를 생성하도록 호스트를 필터링합니다. 필요에 따라 특정 계산에 대해 필터 grep 패턴을 업데이트할 수 있습니다.
    2. 기본 dev-hugepages.mount systemd 장치 파일을 연결하여 페이지 크기를 사용하여 새 마운트를 생성할 수 있도록 합니다.
    3. 폴더가 먼저 생성되었는지 확인합니다.
    4. pagesize 에 대해 systemd 마운트 단위를 생성합니다.
    5. 첫 번째 루프 후에 systemd daemon-reload 를 실행하여 새로 생성된 장치 파일을 포함합니다.
    6. 2M 및 1G 페이지 크기에 대한 각 마운트를 활성화합니다. 필요에 따라 추가 페이지 크기를 포함하도록 이 루프를 업데이트할 수 있습니다.
  2. 선택 사항: /dev 폴더는 nova_computenova_libvirt 컨테이너에 자동으로 바인딩됩니다. 대규모 페이지 마운트에 다른 대상을 사용한 경우, nova_computenova_libvirt 컨테이너에 마운트를 전달해야 합니다.

    parameter_defaults
      NovaComputeOptVolumes:
        - /opt/dev:/opt/dev
      NovaLibvirtOptVolumes:
        - /opt/dev:/opt/dev
  3. ~/templates/firstboot.yaml 환경 파일에 OS::TripleO::NodeUserData 리소스 유형으로 heat 템플릿을 등록합니다.

    resource_registry:
      OS::TripleO::NodeUserData: ./hugepages.yaml
    중요

    NodeUserData 리소스를 각 리소스에 대해 하나의 heat 템플릿에만 등록할 수 있습니다. 후속 사용은 사용할 heat 템플릿을 덮어씁니다.

  4. 첫 번째 부팅 환경 파일을 다른 환경 파일과 함께 스택에 추가하고 오버클라우드를 배포합니다.

    (undercloud)$ openstack overcloud deploy --templates \
      -e [your environment files] \
      -e /home/stack/templates/firstboot.yaml \
      ...