Windows Server 2012 Hyper-V, 네트워크 I/O 가상화에 대한 하드웨어 표준, SR-IOV를 통한 성능 향상

image

Windows Server 2012 Hyper-V에서 가상 스위치를 만들기 위해서, 관리 도구에 들어가보면, 없었던 옵션이 하나 생긴 것을 보실 수 있습니다. SR-IOV(Single Root-IO Virtualiation) 옵션입니다. 오늘은 이 작은 옵션에 대한 이야기를 써볼까 합니다.

가상화 프로젝트나 실제 업무에서 가상화를 사용해보신 분들이라면, 어느 정도 가상화에 워크로드가 올라가고, 운영이 되고 있을 때, 가장 먼저 다가오는 고민거리가 바로 IO에 대한 부담입니다. IO를 처리하는 부분에 대해서는 디스크와 네트워크에 대한 부분이 여기에 해당되는데, 두 요소에 부담이 많이 가는 워크로드, 대표적으로 메일 서버나 데이터베이스(Disk IO), 많은 대역폭을 요구하는 파일 서버(NIC IO)에 대한 부분입니다. 이러한 이유로 아주 과중한 부하가 필요한 경우, 가상화로 이전을 고민해보시라고 Windows Server 2008 R2 시절까지 권장하였고, 현업에서도 N-Tier 응용 프로그램 영역 중, 가장 앞단인 웹 티어나 중간단의 미들 티어 정도가 가상화 영역이었습니다.

이러한 이유는 매우 간단합니다. 지금까지의 전통적인 컴퓨터는 1 하드웨어 = 1 OS라는 구성으로 만들어져 있었으나, 1 하드웨어 = 다수 OS라는 가상화 구조에서는 하드웨어를 어떻게 잘 나눠쓸 수 있을 것이냐에 대한 부분이 필요했고, 이런 진행에 대한 결과물로 나온 것이 CPU Virtualization 기술(Intel-VT, AMD-V), 그리고 IO에 대한 가상화 부분입니다. IO에 대한 가상화 부분에 대한 표준은 여전히 진행형인 부분이 많습니다. IO 가상화가 하드웨어에서 지원하지 않는 경우에는 가상 머신별 IO를 처리하기 위해, 소프트웨어인 Hypervisor의 개입이 불가피하였고, 많은 IO가 요구되는 경우, 이러한 연유로 시스템에 부하가 올라갔던 것이죠.

하드웨어 업계도 이러한 시장의 요구 사항을 잘 알고 있습니다. 또한 하드웨어에 대한 표준을 정의하는 기관에서도 어떻게 하면 하드웨어에서 가상화, 쉽게 표현하면, 하드웨어에서 다수의 요청을 받아, 하드웨어내 하나의 결과물로 잘 만들어낼 수 있을지에 대한 고민을 한다는 것입니다. 하드웨어 표준을 정하는 PCI-SIG(Peripheral Component Interconnect Special Interest Group)에서 네트워크에 대한 IO 가상화 기술을 논의하고 있고, 이에 대한 결과물로 나온 것이 바로 SR-IOV입니다. 표준안뿐만 아니라, 드라이버 레벨에 대한 다양한 의견이 오고가고 있고, Microsoft 역시 해당 기관에 참여하여, 많은 의견을 내고, 듣고 있습니다. 프로세서 제조사인 Intel 사이트에 SR-IOV에 대한 설명이 있습니다.

배경 이야기는 이정도로 각설하고, SR-IOV를 사용하기 전에 Hyper-V가 어떻게 네트워크를 처리하는지 살펴보겠습니다.

image

Hyper-V내 VM의 경우, Hyper-V를 인지하는 경우, 해당 VM내 Virtual NIC이 생성됩니다. 이 vNIC을 다른 말로는 Synthetic NIC(모조의 NIC)이라고 부르고 있습니다. 옛날 에뮬레이션 기반의 가상화의 경우에는 호환성을 위해 Intel 혹은 Realtek과 같은 형태의 가상 하드웨어를 에뮬레이션해주었지만, 성능의 이슈로 좀더 빠른 처리가 필요하여 등장한 형태입니다. Hyper-V에서 가상 머신내 하드웨어에 대한 처리는 상당수가 Hyper-V VMBUS를 통해서 물리적인 머신으로 전달되고, 넘어온 요청에 대해서는 Hypervisor가 이를 하드웨어로 전달하여, 처리하는 구조입니다. VMBUS의 경우에는 Hyper-V를 구성하는 물리적인 서버의 메모리 공유를 통해 전송받기 때문에, 기존보다 훨씬 빠른 처리를 할 수 있게 되었습니다.

image

Synthetic NIC의 경우에도, 네트워크 카드이기에, 운영 체제에서 이를 이용할 수 있는 드라이버가 필요했고, 해당 드라이버는 통합 서비스 설치 디스크(Integration Components, IC라고도 하죠)에 포함되어져 있습니다. Windows Server 2012 OS의 경우에는 해당 IC가 내장되어져 있기에, 추가적인 설치가 필요없지만, 하위 버전의 OS를 사용하는 VM의 경우에는 IC를 업그레이드해주어야, 최적의 Hyper-V 이용이 가능합니다. Linux의 경우에 Integration Components(현재 3.3이 최신)을 RPM 패키지로 설치해야 하는 이유 중 하나가 바로 Hyper-V 환경에 대한 드라이버 설치에 해당됩니다.

image

예상된 바일 것입니다. 이렇게 VMBUS를 통해 처리되는 IO에 대해서도, 앞서 언급되었던 것처럼, 어찌보면 소프트웨어의 일부 개입(Hypervisor)이 필요합니다. 물론 일전의 에뮬레이션 방식보단 훨씬 뛰어난 성능을 보여줍니다.

만약 이런 그림은 어떨까요? 하드웨어 NIC에서 포트는 하나이지만, 가상 포트를 여러개를 제공하고, 포트별 들어오는 요청에 대해서 하드웨어에서 큐 처리를 할 수 있다면… 당연히 큐를 처리할 수 있는 영역이 많을 수록 성능은 좋아지겠죠. IOV에 대한 접근도 여기서 시작됩니다. 물리적인 포트의 숫자보다 가상 머신의 숫자가 많기에, 하드웨어적인 포트 숫자를 여러 VM 돌아가면서 쓰기 위해서, Hypervisor의 도움이 필요하다고 하였습니다. 그렇지만 하드웨어 NIC에서 가상의 포트(이를 SR-IOV에서는 Virtual Function이라고 합니다)를 제공하고, VM별로 이 포트를 할당한다면.. SR-IOV는 이러한 VF별에 대한 요청 처리를 단일 큐를 배정하여, 처리한다고 Single Root라고 하며, 여러 큐에서 처리한다면, Multi Root라고 부르겠죠.

image

SR-IOV를 사용하기 위해서는 SR-IOV 기술을 내장한 NIC이 필수적입니다. SR-IOV의 경우에는 10G NIC에 기본적으로 지원이 되는 경우가 많습니다.(40G, 100G도 포함) SR-IOV를 지원하는 NIC이 있다면, 이를 동작시켜, 실제 하드웨어로 데이터를 전달하는 형태로 VM을 설정할 수 있고(VM BUS로는 VF에 대한 제어 경로만), 기존에 IO로 고생했던 부분에 대해서, 네트워크 영역은 문제 해결이 가능합니다. Windows Server 2012내 Get-NetAdapterSriov Cmdlet을 이용해서 SR-IOV를 지원하는 NIC이 있는지 확인할 수 있습니다.

image

Hyper-V의 기본 설정을 확인하는 Get-VMHost Cmdlet을 통해, Hyper-V 물리적인 머신에 대한 SR-IOV 설정을 확인할 수 있습니다.

image

기본적으로 SR-IOV는 BIOS 레벨에서 Global 설정이 Enable되어야 합니다. 이는 단순하게 IO에 대한 처리를 담당하는 NIC과 더불어 IOMMU(Input/Output Memory Management Unit)의 개입이 필요하기 때문입니다. (개인적으로 BIOS에서 Disable 된 상태에서, Hyper-V SR-IOV를 Enable했더니, NIC이 Connect/Disconnect을 반복하는 증상이 생겼던 경험이..)

image

BIOS에서 해당 값을 Enable한 후, Get-VMHost를 해보면 또하나 확인해야할 값이 있습니다.

SRIOV

SR-IOV에서 사용하는 NIC의 VF는 어찌보면, 하드웨어에 대한 맵핑입니다. 이러한 이유로 하드웨어에 대한 직접 접근의 보안 취약점이 발생할 수 있고, 이러한 보안 취약점을 막기 위해, 조치된(루트 포트 대체 오류 배달 메커니즘이라고 부릅니다.) BIOS를 하드웨어 제조사에서 제공받아야 합니다. 이러한 제조사의 신뢰된 BIOS를 사용하는 경우에, 관리자가 이제부터 SR-IOV를 사용하겠다고, 레지스트리 수정을 해줘야 한다는 의미입니다. 설정 후 다시  시작이 필요합니다.

자, 이제 전체적인 서버에서 SR-IOV에 대한 설정이 완료되고, 이를 사용하도록 Hyper-V 가상 스위치를 생성해야 합니다. 주의하실 사항은 생성 후, SR-IOV 설정을 변경할 수 없기에, 최초 가상 스위치 생성시, 이를 켜지 않으면, 삭제 후 재 생성해야 합니다. 또한 SR-IOV를 사용할 수 없는 NIC에 대해 가상 스위치를 SR-IOV 옵션과 함께 생성한 경우에는, SR-IOV 기술이 켜지지 않으며(체크 박스는 체크되어져 있지만), 이벤트 뷰어에 SR-IOV를 동작할 수 없다는 경고가 남게 됩니다.

SR-IOV를 사용할 가상 머신의 vNIC내 하드웨어 가속에서 SR-IOV 옵션을 체크하고, 부팅을 하게 되면, 물리적인 NIC에서 VF가 할당되고, 해당 VF는 물리적인 하드웨어의 PCI BUS에 연결되어, 물리적인 NIC으로 데이터를 전송하게 됩니다. (아래 왼쪽 그림은 물리적인 머신의 PCI Express내 SR-IOV를 지원하는 Intel NIC 모습, 오른쪽 그림은 SR-IOV를 사용하는 VM의 PCI BUS내에서 물리적인 PCI Express를 연결하여 NIC에 연결되는 VF)

image image 

하나의 NIC에서 제공하는 VF의 갯수는 NIC의 종류마다 틀립니다. Get-VMSwitch Cmdlet을 이용하여, 해당 가상 스위치를 살펴보면 알수 있습니다.

image

IovEnable 값은 현재 동작 여부, IovVirtualFunctionCount는 전체 VF의 갯수, IovVirtualFunctionsInUse는 현재 사용중인 VF의 숫자, IovQueuePairCount는 물리적인 NIC의 큐 숫자, IovQueuePairsInUse는 사용중인 VF를 위한 Queue의 숫자, IovSupport는 해당 vSwitch가 IOV를 지원하는지, IovSupportReason은 지원하지 않을 경우, 이유가 표시됩니다.

image

Get-VMNetworkAdapter Cmdlet을 이용하여, VM에 설정된 vNIC에 대한 IOV 설정을 확인할 수 있습니다. IovWeight가 0이면 Disable, 100이면 Enable, 그리고 IovQueuePairsRequested와 Assigned된 숫자, 마지막으로 VF에 대한 정보를 확인할 수 있습니다. 이중 VF의 정보를 열어보면, VM임에도 불구하고, 실제 하드웨어에 정보를 가지고 있죠.

image

Hyper-V 관리 도구내에서는 간단히 사용 여부만을 확인할 수 있습니다.

image

아주 작은 체크 박스 하나가 이렇게 많은 의미를 담고 있고, 이를 통해 더 나은 성능을 보여주는 방향으로 가고 있는 것입니다. 조금은 복잡해 보일 수 있으나, SR-IOV를 찬찬히 살펴보시면, 이해가 되실 수 있는 부분이며, 이 표준안을 빠르게 담고 있는 Windows Server 2012 Hyper-V를 통해 더 나은 네트워크 성능을 VM 레벨에서 향해갈 수 있을 것이라 확신합니다. 해당 기술은 Server용 기술이기에, Windows 8 Hyper-V를 사용할 경우에는 제공되지 않다는 점도 명시합니다. 미소