이 문서에서는 비균일 메모리 액세스(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을 구성하려면 다음 안내를 따르세요.
워커 노드에서
kubelet
파일을 찾고 편집하기 위해 엽니다.edit /etc/default/kubelet
kubelet
파일이 표시되지 않으면 다음 명령어를 사용하여 만듭니다.echo "KUBELET_EXTRA_ARGS=\"\"" >> /etc/default/kubelet
이 명령어는
KUBELET_EXTRA_ARGS=""
섹션이 비어 있는 상태로kubelet
파일을 만듭니다.static
정책으로 CPU 관리자를 사용 설정하려면 파일의KUBELET_EXTRA_ARGS=""
섹션에--cpu-manager-policy=static
플래그를 추가합니다.KUBELET_EXTRA_ARGS="--cpu-manager-policy=static"
Static
정책으로 메모리 관리자를 사용 설정하려면 파일의KUBELET_EXTRA_ARGS=""
섹션에--memory-manager-policy=Static
플래그를 추가합니다.KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static"
restricted
정책으로 토폴로지 관리자를 사용 설정하려면 파일의KUBELET_EXTRA_ARGS=""
섹션에--topology-manager-policy=restricted
플래그를 추가합니다.KUBELET_EXTRA_ARGS="--cpu-manager-policy=static --memory-manager-policy=Static --topology-manager-policy=restricted"
베어메탈용 GKE에서 예약한 현재 메모리 양을 확인합니다.
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
설정은 베어메탈용 GKE에서 노드에 메모리 3,470메비바이트를 예약했음을 나타냅니다.제거 임곗값을 고려해서
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"
/var/lib
디렉터리에서 CPU 및 메모리 상태 파일을 삭제합니다.rm /var/lib/cpu_manager_state rm /var/lib/memory_manager_state
kubelet을 다시 시작합니다.
systemctl start kubelet
이러한 정책 설정에 대한 자세한 내용은 다음 Kubernetes 문서를 참조하세요.
hugepage를 사용하도록 노드 구성
Static
정책으로 메모리 관리자를 사용 설정한 후 NUMA 노드에서 컨테이너 워크로드 성능을 더 향상시키기 위해 hugepage를 추가할 수 있습니다.
이름에서 알 수 있듯이 hugepage를 사용하면 표준 4KiB(키비바이트)보다 큰 메모리 페이지를 지정할 수 있습니다. GDC용 VM 런타임은 2메비바이트(MiB) 및 1기비바이트(GiB) hugepage를 지원합니다. 런타임에 노드에 대해 또는 노드 머신 부팅 시에 hugepage를 설정할 수 있습니다. NUMA 인식 VM을 실행하려는 각 노드에서 hugepage를 구성하는 것이 좋습니다.
런타임 시 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을 만들려면 다음 안내를 따르세요.
안내에 따라 매니페스트에서 VM을 만듭니다.
다음
compute
설정을 사용하여 NUMA 인식으로 VM을 구성합니다.spec.compute.guaranteed
:guaranteed
를true
로 설정합니다. 이 설정을 사용하면virt-launcher
포드가 Kubernetes 보장 서비스 품질(QoS) 클래스에 배치되도록 구성됩니다.spec.compute.advancedCompute
:dedicatedCPUPlacement
:dedicatedCPUPlacement
를true
로 설정합니다. 이 설정은 가상 CPU를 노드의 실제 CPU로 고정합니다.hugePageSize
:hugePageSize
를2Mi
또는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