Windows Server 2012 Hyper-V, 64개의 최대 코어 지원을 위한 vNUMA, 그리고 이에 대한 구성 및 주의 사항

image

Windows Server 2012의 Hyper-V는 가상 머신에서 사용할 수 있는 최대 지원 vCPU 코어의 개수가 최대 64개, 그리고 최대 지원 메모리는 1TB(테라바이트)라는 사실은 지난 8월 10일 포스팅, Windows Server 2012 Hyper-V, 64개의 vCPU를 가진 가상 머신… 에서 살펴보았습니다. 이러한 최대 지원 vCPU의 개수는 Windows나 Linux 계열에 구분되지 않고, 동일하며, 버전에 따라 약간의 차이가 있긴 합니다.

개별 운영 체제별로 지원하는 최대 지원 범위는 https://technet.microsoft.com/en-us/library/hh831531.aspx에 잘 정리되어져 있습니다.

vCPU가 4개까지 지원되던 Windows Server 2008 R2와는 달리, 64개까지 지원되는 Windows Server 2012의 Hyper-V는 CPU 코어 증가에 따른 메모리 처리에 병목을 막기 위한 기술인 NUMA(Non-Uniform Memory Access)를 가상 머신에서 적절히 사용할 수 있게 구성해야 했습니다.

간단히 설명하여 NUMA는 CPU 코어와 사용 가능한 메모리를 노드(Node)라는 이름으로 묶고, 해당 노드내 코어는 최대한 같은 노드내의 메모리를 사용하게 해주는 기술입니다. 이를 통해 전체 코어들간 메모리를 사용하기 위해 접근하는 경쟁하는 병목 현상을 줄일 수 있게 됩니다. 물론 같은 노드내 메모리를 다 사용했을 경우엔, 원격 노드의 메모리를 사용할 수도 있습니다. 코어와 메모리를 사용하는 형태에 따라 NUMA가 좋을 수도, 나쁠 수도 있지만, 많은 기술들이 현재 NUMA를 최적화하여 사용할 수 있게 설계되어져 있죠. Windows Server의 경우에는 2003 버전부터 물리적인 하드웨어의 NUMA 구조를 최적화하여 사용하고 있었습니다. 이는 하드웨어와 운영 체제가 알아서 하는 기술이기에, 엔지니어는 이를 알지 못하더라도, 큰 이슈가 없었던 것입니다. (더 자세한 NUMA 설명은 https://ko.wikipedia.org/wiki/Non-Uniform_Memory_Access를 참고하세요 미소)

image

이제 가상 머신이 많은 코어를 사용하면서, 가상 머신에서 사용하는 코어와 메모리도 물리적인 머신의 NUMA 아키텍쳐와 최대한 일치해야 하는 이슈가 발생하였습니다. 최대한 물리적인 NUMA 구조를 사용하는 것이 가상 머신의 코어와 메모리 처리에도 성능을 발휘하겠죠.

image

알아서 하드웨어와 운영 체제가 할 일이라고 설명드렸습니다. 다만 Hyper-V는 이러한 NUMA의 노드 구조가 어떻게 만들어져 있고, 노드별로 몇개의 코어와 얼마의 메모리가 묶여 있는지를 알아야 합니다. 이를 잘 쪼개서, 최대한 같은 노드내에서 가상 머신이 코어와 메모리를 할당받을 수 있게 한다는 의미입니다. 이 NUMA 구조를 입력해주는 가상 머신의 설정이 있습니다.

메모리에 대한 접근은 프로세서 별로 처리되기에, 단일 NUMA 노드에 할당되는 코어와 메모리는 프로세서 숫자와 연관이 많습니다. Intel E7 계열의 CPU는 코어가 10개, 그리고 하이퍼스레딩(HT) 기술을 동작하여 20개를 만들 수 있습니다.(Hyper-V는 HT 기술을 사용하는 것을 권장합니다.) 20개의 코어가 하나의 NUMA 노드에 배정될 수 있고, 노드당 메모리는 전체 메모리 합에서 프로세서 개수를 나눈 숫자와 비슷합니다.

image

NUMA 토폴로지 항목의 단일 NUMA 노드 구성이 최대 프로세서 수가 20개, 최대 메모리가 30950(대략 31G)인 것을 알 수 있습니다. 바로 윗 항목에 소켓이 4개라고 나오는 것으로 봐선, 해당 서버는 20개의 코어 X 4개의 소켓, 그리고 31G X 4개의 노드.. 결국 물리적인 서버의 코어는 80개, 메모리는 대략 128G인 것을 알 수 있습니다. 이런 노드 구성을 하드웨어에서 만들어주고, 운영 체제가 사용하고, 이를 Hyper-V에서 가져다 쓰는 것입니다.

그렇다면.. Hyper-V의 NUMA 구성 설정이 정확한 숫자를 넣어야 할 필요가 있겠죠? 그런데, 하드웨어 숫자를 체크하고, 이러는 작업이 불편하거나, 잘 알 수 없을 것입니다. 이 경우, 해당 페이지내 “하드웨어 토폴로지 사용” 버튼을 누르면, 알아서 하드웨어의 정보를 넣어줍니다.

보통 Windows Server 2012 Hyper-V에서 새롭게 VM을 만들면, 최적의 NUMA 값을 알아서 넣어줍니다. 그러나 2008, 2008 R2에서 사용하던 VM을 가져오기(Import) 했을 경우, 해당 VM의 설정 파일(XML)에는 NUMA 설정이 없기에.. 해당 값이 잘못된 값이 들어가 있을 수 있기에, 꼭 “하드웨어 토폴로지 사용”을 눌러주셔야 합니다. 미소

NUMA에서 같은 노드내에 메모리를 접근하는 것을 로컬 메모리 액세스라고 하며, 다른 노드내 메모리를 접근하는 것을 원격 메모리 액세스라고 합니다. 가상 머신 레벨에서 NUMA 노드내를 사용하는 지, 원격을 사용하는지 확인하는 성능 카운터가 존재합니다.

image

Hyper-V Hypervisor Virtual Processor 개체내 원격 런타임 백분율 카운터가 해당 수치를 보여줍니다. 당연히 0에 가깝게 나와야 정상적으로 NUMA를 최적화해서 사용한다는 의미입니다. 그림에서 나오는 데로 KOALRA-64Core-01이라는 VM은 가상 프로세서(VP) 0부터 63번까지가 0에 가까운 수치가 나오고 있습니다. 이 수치가 높다면, 잘못된 NUMA 구조를 VM에서 설정했다는 의미입니다.

주의 사항이 한가지 더 있습니다. NUMA는 이미 몇번 언급한 데로, 프로세서 코어와 메모리를 그룹화시켜주는 것입니다. 이는 머신이 켜질 때, 할당되게 되는 것이죠. 켜질 때, 메모리와 코어의 노드 구성이 불가능한 경우가 있습니다. 바로 VM의 동적 메모리(Dynamic Memory) 기술입니다.

image

동적 메모리는 최소 메모리와 최대 메모리를 지정해주고, VM에서 메모리를 요구하는 형태에 따라, 메모리를 증가/축소시켜주는 기술입니다. 이는 최초 NUMA 노드 구성을 불가능하게 하기에, 동적 메모리를 사용하는 경우에는 VM 설정에서 경고가 나옵니다. NUMA가 아닌, UMA로 구성된다고... 당연히 성능이 떨어지겠죠. 성능 카운터에서는 원격 런타임 백분율 값이 부하량이 늘수록 높아지게 됩니다. 이에 대용량 VM은 NUMA를 사용시 고정 메모리를 사용해야 최적의 성능이 나오게 됩니다.

image

두번째 주의 사항은 “하드웨어 토폴로지 사용”에 대한 부분입니다. 위의 그림에서 이상한 점을 찾으셨나요? 메모리 정보가 작업 관리자에서는 128GB가 나옵니다만, 왼쪽 항목에선 112GB만 인식된 것을 볼 수 있습니다. 이 경우, NUMA 구성이 정확한 메모리 숫자로 나눠질 수가 없기에, 정상적인 성능이 나올 수 없습니다. 장착된 메모리와 프로세서가 정상적으로 인식되는지 확인 후에, vNUMA를 사용하시는 것을 권장드립니다.

Windows Server 2012 Hyper-V는 다양한 클라우드 시나리오에 적절하게 규모가 작은 용량의 VM에서 규모가 큰 용량의 VM까지를 최적으로 구성할 수 있도록 설계되어져 있습니다. CPU와 메모리에 대한 부분이 오늘 언급드린 vNUMA이며, 네트워크 I/O에 대한 가상화 표준 기술인 SR-IOV(Windows Server 2012 Hyper-V, 네트워크 I/O 가상화에 대한 하드웨어 표준, SR-IOV를 통한 성능 향상 포스팅 참고)을 이용하여 보다 하드웨어 수준에 가까운, IO 처리를 보여줍니다.