NUMA 인식 VM 구성

이 문서에서는 비균일 메모리 액세스(NUMA)의 컴퓨팅 효율로 성능이 높고 대기 시간이 낮은 워크로드를 지원하도록 클러스터 및 VM을 구성하는 방법을 설명합니다. 클러스터 노드에 대한 Kubernetes 설정 조정 방법을 설명합니다. 이 문서에는 또한 NUMA 노드에서 예약하고 이를 활용할 수 있게 NUMA 어피니티에 따라 가상 머신(VM)을 구성하기 위한 안내도 포함되어 있습니다.

NUMA 인식 VM에서 VM 내부의 모든 통신은 NUMA 노드에 로컬로 수행됩니다. NUMA 인식 VM은 VM 성능을 저해할 수 있는 원격 리소스에 대한 데이터 트랜잭션을 방지합니다.

NUMA를 사용하도록 노드 구성

다음 섹션에서는 노드 조정을 위해 중요한 Kubernetes 구성요소를 구성하고 NUMA 인식 컨테이너를 예약하는 방법을 설명합니다. 이러한 NUMA 노드는 CPU 및 메모리 성능을 최적화하기 위해 조정됩니다. NUMA 인식 VM을 실행하려는 각 노드에 대한 안내를 따르세요.

kubelet 구성 업데이트

NUMA 노드 어피니티를 지원하도록 노드를 구성할 때는 kubelet 구성을 다음과 같이 변경해야 합니다.

  • static 정책으로 CPU 관리자 사용 설정
  • Static 정책으로 메모리 관리자 사용 설정
  • restricted 토폴로지로 토폴로지 관리자 사용 설정

워커 노드에서 kubelet을 구성하려면 다음 안내를 따르세요.

  1. 워커 노드에서 kubelet 파일을 찾고 편집하기 위해 엽니다.

    edit /etc/default/kubelet
    

    kubelet 파일이 표시되지 않으면 다음 명령어를 사용하여 만듭니다.

    echo "KUBELET_EXTRA_ARGS=\"\"" >> /etc/default/kubelet
    

    이 명령어는 KUBELET_EXTRA_ARGS="" 섹션이 비어 있는 상태로 kubelet 파일을 만듭니다.

  2. static 정책으로 CPU 관리자를 사용 설정하려면 파일의 KUBELET_EXTRA_ARGS="" 섹션에 --cpu-manager-policy=static 플래그를 추가합니다.

    KUBELET_EXTRA_ARGS="--cpu-manager-policy=static"
    
  3. Static 정책으로 메모리 관리자를 사용 설정하려면 파일의 KUBELET_EXTRA_ARGS="" 섹션에 --memory-manager-policy=Static 플래그를 추가합니다.

    KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static"
    
  4. restricted 정책으로 토폴로지 관리자를 사용 설정하려면 파일의 KUBELET_EXTRA_ARGS="" 섹션에 --topology-manager-policy=restricted 플래그를 추가합니다.

    KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static --topology-manager-policy=restricted"
    
  5. Google Distributed Cloud에서 예약한 현재 메모리 양을 확인합니다.

    cat /var/lib/kubelet/kubeadm-flags.env
    

    다음과 유사하게 출력됩니다.

    KUBELET_KUBEADM_ARGS="--anonymous-auth=false --authentication-token-webhook=true --authorization-mode=Webhook --container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock --feature-gates=SeccompDefault=true --kube-reserved=cpu=100m,memory=3470Mi --max-pods=110 --node-ip=192.168.1.190 --node-labels=baremetal.cluster.gke.io/k8s-ip=192.168.1.190,baremetal.cluster.gke.io/namespace=cluster-user001,baremetal.cluster.gke.io/node-pool=node-pool-1,cloud.google.com/gke-nodepool=node-pool-1 --pod-infra-container-image=gcr.io/anthos-baremetal-release/pause-amd64:3.1-gke.5 --provider-id=baremetal://192.168.1.190 --read-only-port=10255 --rotate-server-certificates=true --seccomp-default=true"

    --kube-reserved=cpu=100m,memory=3470Mi 설정은 Google Distributed Cloud가 노드에 메모리 3,470메비바이트를 예약했음을 나타냅니다.

  6. 제거 기준점을 고려해서 kubelet 파일의 KUBELET_EXTRA_ARGS 섹션에서 --reserved-memory 플래그를 현재 예약된 메모리보다 많은 100MiB(메비바이트)로 설정합니다. 예약된 메모리가 없으면 이 단계를 건너뛸 수 있습니다.

    예를 들어 이전 단계의 예시에서 예약된 메모리가 3470Mi인 경우 kubelet 파일에서 3570Mi 메모리를 예약합니다.

    KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static --topology-manager-policy=restricted --reserved-memory=0:memory=3570Mi"
    
  7. /var/lib 디렉터리에서 CPU 및 메모리 상태 파일을 삭제합니다.

    rm /var/lib/cpu_manager_state
    rm /var/lib/memory_manager_state
    
  8. kubelet을 다시 시작합니다.

    systemctl start kubelet
    

이러한 정책 설정에 대한 자세한 내용은 다음 Kubernetes 문서를 참조하세요.

hugepage를 사용하도록 노드 구성

Static 정책으로 메모리 관리자를 사용 설정한 후 NUMA 노드에서 컨테이너 워크로드 성능을 더 향상시키기 위해 hugepage를 추가할 수 있습니다. 이름에서 알 수 있듯이 hugepage를 사용하면 표준 4KiB(키비바이트)보다 큰 메모리 페이지를 지정할 수 있습니다. GDC용 VM 런타임은 2메비바이트(MiB) 및 1기비바이트(GiB) hugepage를 지원합니다. 런타임에 노드에 대해 또는 노드 머신 부팅 시에 hugepage를 설정할 수 있습니다. NUMA 인식 VM을 실행하려는 각 노드에서 hugepage를 구성하는 것이 좋습니다.

  1. 런타임 시 NUMA 노드에서 특정 크기의 hugepage 수를 구성하려면 다음 명령어를 사용합니다.

    echo HUGEPAGE_QTY > \
        /sys/devices/system/node/NUMA_NODE/hugepages/hugepages-HUGEPAGE_SIZEkB/nr_hugepages
    

    다음을 바꿉니다.

    • HUGEPAGE_QTY: 지정된 크기로 할당할 hugepage 수입니다.

    • NUMA_NODE: node0과 같이 hugepage를 할당하려는 NUMA 노드입니다.

    • HUGEPAGE_SIZE: 2048(2MiB) 또는 1048576(1GiB)의 KiB(키비바이트) 단위의 hugepage 크기입니다.

NUMA 노드를 사용하도록 VM 구성

NUMA에 대해 클러스터 노드를 조정한 후 NUMA 인식 VM을 만들 수 있습니다. NUMA 인식 VM은 NUMA 노드에서 예약됩니다.

NUMA 인식 VM을 만들려면 다음 안내를 따르세요.

  1. 안내에 따라 매니페스트에서 VM을 만듭니다.

    다음 compute 설정을 사용하여 NUMA 인식으로 VM을 구성합니다.

    • spec.compute.guaranteed: guaranteedtrue로 설정합니다. 이 설정을 사용하면 virt-launcher 포드가 Kubernetes 보장 서비스 품질(QoS) 클래스에 배치되도록 구성됩니다.

    • spec.compute.advancedCompute:

      • dedicatedCPUPlacement: dedicatedCPUPlacementtrue로 설정합니다. 이 설정은 가상 CPU를 노드의 실제 CPU로 고정합니다.
      • hugePageSize: hugePageSize2Mi 또는 1Gi로 설정하여 2MiB(메비바이트) 또는 1GiB(기비바이트)를 사용하도록 VM의 hugepage 크기를 지정합니다.
      • numaGuestMappingPassthrough: 이 설정에 대해 빈 구조({})를 포함합니다. 이 설정은 VM이 NUMA 노드에만 예약되도록 NUMA 어피니티를 설정합니다.

    다음 예시 VirtualMachine 매니페스트는 NUMA 인식 VM 구성이 표시되는 방식을 보여줍니다.

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: vm1
    spec:
      compute:
        cpu:
          vcpus: 2
        guaranteed: true
        advancedCompute:
          dedicatedCPUPlacement: true
          hugePageSize: 2Mi
          numaGuestMappingPassthrough: {}
        memory:
          capacity: 256Mi
      interfaces:
      - name: eth0
        networkName: pod-network
        default: true
      disks:
      - virtualMachineDiskName: disk-from-gcs
        boot: true
        readOnly: true