새로운 CPU 매니저 정적 정책 옵션인 prefer-align-cpus-by-uncorecache가 Kubernetes v1.32에서 알파 기능으로 도입되었으며, Kubernetes v1.34에서는 베타 단계로 승격되었습니다.
이 CPU 매니저 정책 옵션은 분할 언코어 캐시 아키텍처를 가진 프로세서에서 실행되는 특정 워크로드의 성능을 최적화하도록 설계되었습니다.
이 글에서는 이것이 무엇을 의미하고 왜 유용한지 설명해 드릴 것입니다.
기능 이해하기
언코어 캐시란 무엇인가요?
비교적 최근까지, 거의 모든 주류 컴퓨터 프로세서는 다중 CPU 패키지 내의 모든 코어에서 공유되는 모놀리식 마지막 레벨 캐시를 가지고 있었습니다. 이 모놀리식 캐시는 언코어 캐시(특정 코어에 연결되어 있지 않기 때문) 또는 레벨 3 캐시라고도 불립니다. 레벨 3 캐시 외에도, 일반적으로 레벨 1 및 레벨 2 캐시라고 불리는 다른 캐시가 있으며, 이는 특정 CPU 코어와 연관되어 있습니다.
CPU 코어와 캐시 간의 접근 지연 시간을 줄이기 위해, 최근 AMD64 및 ARM 아키텍처 기반 프로세서들은 분할 언코어 캐시 아키텍처를 도입했습니다. 이 아키텍처에서는 마지막 레벨 캐시가 여러 물리적 캐시로 분할되며, 이는 물리적 패키지 내의 특정 CPU 그룹에 정렬됩니다.
CPU 패키지 내의 짧아진 거리는 지연 시간을 줄이는 데 도움이 됩니다.

Kubernetes는 CPU 패키지 내의 캐시 토폴로지를 고려하여 워크로드를 배치할 수 있습니다.
캐시 인식 워크로드 배치
아래 매트릭스는 분할 언코어 캐시를 사용하는 프로세서에서 캐시 일관성 프로토콜을 통해 CPU 간에 패킷을 전달할 때 측정된 CPU-간 지연 시간 (나노초 단위, 낮을수록 좋음)을 보여줍니다.
이 예시에서, 프로세서 패키지는 2개의 언코어 캐시로 구성됩니다.
각 언코어 캐시는 8개의 CPU 코어를 지원합니다.
매트릭스의 파란색 항목은 동일한 언코어 캐시를 공유하는 CPU 간의 지연 시간을 나타내며, 회색 항목은 다른 언코어 캐시에 해당하는 CPU 간의 지연 시간을 나타냅니다. 다른 캐시에 속하는 CPU 간의 지연 시간은 동일한 캐시에 속하는 CPU 간의 지연 시간보다 높습니다.
prefer-align-cpus-by-uncorecache를 활성화하면, 정적 CPU 매니저는 컨테이너에 할당된 모든 CPU가 동일한 언코어 캐시를 공유하도록 컨테이너에 CPU 리소스를 할당하려고 시도합니다.
이 정책은 컨테이너의 요구 사항을 기반으로 하며 노드의 할당 가능한 리소스를 고려하여, 컨테이너의 CPU 리소스가 여러 언코어 캐시에 분산되는 것을 최소화하는 것을 목표로 하는 최선 노력(best-effort) 방식으로 작동합니다.
가능한 경우, 최소한의 언코어 캐시를 사용하는 CPU 세트에서 워크로드를 실행함으로써, 애플리케이션은 감소된 캐시 지연 시간(위 매트릭스에서 볼 수 있듯이)과 다른 워크로드와의 경합 감소로부터 이점을 얻으며, 이는 전반적으로 더 높은 처리량으로 이어질 수 있습니다. 이점은 노드의 프로세서가 분할 언코어 캐시 토폴로지를 사용하는 경우에만 나타납니다.
아래 다이어그램은 이 기능이 활성화되었을 때의 언코어 캐시 정렬을 보여줍니다.

기본적으로 Kubernetes는 언코어 캐시 토폴로지를 고려하지 않습니다. 컨테이너는 패킹(packed) 방식으로 CPU 리소스를 할당받습니다. 결과적으로, 컨테이너 1과 컨테이너 2는 언코어 캐시 0에서의 캐시 접근 경합으로 인해 '시끄러운 이웃(noisy neighbor)' 영향을 경험할 수 있습니다. 또한, 컨테이너 2는 두 캐시에 걸쳐 CPU가 분산되어 있어 교차 캐시 지연 시간(cross-cache latency)을 유발할 수 있습니다.
prefer-align-cpus-by-uncorecache가 활성화되면, 각 컨테이너는 개별 캐시에 격리됩니다. 이는 컨테이너 간의 캐시 경합을 해결하고 사용 중인 CPU의 캐시 지연 시간을 최소화합니다.
사용 사례
일반적인 사용 사례로는 vRAN, 모바일 패킷 코어 및 방화벽과 같은 통신(telco) 애플리케이션이 포함될 수 있습니다. prefer-align-cpus-by-uncorecache가 제공하는 최적화는 워크로드에 따라 달라질 수 있다는 점에 유의해야 합니다. 예를 들어, 메모리 대역폭에 제약을 받는(memory bandwidth bound) 애플리케이션은 더 많은 언코어 캐시를 활용할 경우 메모리 대역폭 접근을 증가시킬 수 있으므로, 언코어 캐시 정렬로부터 이점을 얻지 못할 수도 있습니다.
기능 활성화
이 기능을 활성화하려면, CPU 매니저 정책을 static으로 설정하고 CPU 매니저 정책 옵션에 prefer-align-cpus-by-uncorecache를 활성화해야 합니다.
Kubernetes 1.34에서는 이 기능이 베타 단계에 있으므로, CPUManagerPolicyBetaOptions 피처 게이트도 활성화해야 합니다.
kubelet 설정 파일에 다음 내용을 추가합니다:
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
featureGates:
...
CPUManagerPolicyBetaOptions: true
cpuManagerPolicy: "static"
cpuManagerPolicyOptions:
prefer-align-cpus-by-uncorecache: "true"
reservedSystemCPUs: "0"
...
기존 노드에 이 변경 사항을 적용하는 경우, cpu_manager_state 파일을 제거한 다음 kubelet을 다시 시작하세요.
prefer-align-cpus-by-uncorecache는 모놀리식 언코어 캐시 프로세서가 있는 노드에서도 활성화할 수 있습니다. 이 기능은 최선 노력 소켓 정렬 효과를 모방하여 기본 정적 CPU 매니저 정책과 유사하게 소켓에 CPU 리소스를 패킹할 것입니다.
추가 자료
CPU 매니저와 사용 가능한 정책에 대해 더 자세히 알아보려면 노드 리소스 매니저를 참조하세요.
prefer-align-cpus-by-uncorecache에 대한 문서는 여기에서 참조할 수 있습니다.
prefer-align-cpus-by-uncorecache가 어떻게 구현되었는지에 대한 자세한 내용은 Kubernetes Enhancement Proposal을 참조하십시오.
참여하기
이 기능은 SIG Node에 의해 주도됩니다. 이 기능 개발에 기여하거나, 피드백을 공유하거나, 다른 진행 중인 SIG Node 프로젝트에 참여하는 데 관심이 있다면 SIG Node 회의에 참석하여 자세한 내용을 확인하십시오.