이 게시물은 원래 Dell Windows 엔지니어링 팀의 Abhijit Khande & Vineeth V Acharya가 작성했습니다.
의견을 환영합니다! 주제를 제안하거나 다른 의견을 작성하려면 WinServerBlogs@dell.com 에게 문의하십시오.
Microsoft는 Microsoft® Windows Server® 2012 베타 운영 체제를 통해 네트워킹 공간의 다양한 기능에 대한 지원을 도입했습니다. 이러한 중요하고 흥미로운 기능 중 하나는
단일 루트 I/O 가상화 (SR-IOV) - 가상 머신이 단일 PCI-e 디바이스를 공유할 수 있도록 합니다. 이 게시물에서는 Windows Server 2012 베타의 SR-IOV에 대한 기본 개요와 네트워크 I/O 중에 가상화된 환경에서 CPU 사용률을 크게 줄이는 방법을 제공합니다.
SR-IOV 인터페이스는 PCIe(PCI Express) 사양의 확장입니다. SR-IOV를 사용하면 네트워크 어댑터와 같은 단일 PCIe 디바이스가 PCI 버스에 여러 경량 하드웨어 표면을 제공하고 다양한 인스턴스 간에 리소스에 대한 액세스를 분리할 수 있습니다. 이는 (일반적인) 물리적 기능(PF) 외에도 여러 가상 기능(VF)을 사용하여 달성됩니다. 하드웨어에 따라 다르므로 PCIe 디바이스와 플랫폼이 모두 이 기능을 지원해야 합니다.
일반적으로 가상 머신으로 향하는 패킷은 호스트 OS에 있는 물리적 네트워크 어댑터(물리적 기능 사용)에 의해 수신됩니다. 이 패킷은 NDIS(NIC용 네트워크 드라이버 인터페이스 사양) 드라이버 모듈에서 처리됩니다. 그런 다음 패킷은 Hyper-V 스위치에 제공되며, Hyper-V 스위치는 그림 1과 같이 패킷(예: 라우팅, VLAN 필터링)을 처리하고 VMBus를 통해 대상 VM으로 패킷을 전달합니다. VM이 패킷을 보내야 하는 경우 역방향 경로를 따릅니다.
SR-IOV를 사용하면 VM이 그림 1과 같이 기존 경로를 완전히 우회하여 VF(가상 함수)를 사용하여 실제 네트워크 어댑터로 직접 패킷을 보내고 받을 수 있습니다. 이렇게 하면 네트워크 I/O가 향상될 뿐만 아니라 호스트 시스템의 CPU에 대한 오버헤드도 줄어듭니다.
그림 1 : SR-IOV가 있거나 없는 데이터 경로
실시간 마이그레이션 및 SR-IOV
Windows Server 2012 베타에서는 VM에서 사용하는 SR-IOV를 사용하여 실시간 마이그레이션을 수행할 수 있습니다. 원본 및 대상 시스템이 SR-IOV를 지원하고 대상에 사용 가능한 VF가 있는 경우 VM은 가상 함수를 사용합니다. 그렇지 않은 경우 VM은 기존 경로(VM-Bus)로 되돌아갑니다.
각 SR-IOV 지원 네트워크 어댑터는 PowerShell 명령 "Get-NetAdapterSriov"를 실행하여 가져올 수 있는 고정된 수의 가상 함수를 노출합니다.
성능 분석
SR-IOV 사용 여부에 따른 성능을 비교하기 위해 실험실에서 몇 가지 테스트를 수행했습니다. 테스트 환경은 테스트가 실행되는 테스트 서버 하나와 파일 서버 하나로 구성됩니다. 테스트 서버는 인텔® X520 10GB 이더넷 어댑터와 Windows Server 2012 베타 OS가 탑재된 Dell PowerEdge™ R710 II입니다. 파일 서버는 여러 SMB 공유를 호스팅하며 Dell PowerConnect™ 8024 스위치를 통해 10GB 네트워크를 사용하여 테스트 서버에 연결됩니다.
네트워크 데이터 전송에 참여하는 여러 드라이버 모듈에서 예약한 DPC(Deferred Procedure Call)에서 사용하는 CPU와 관련하여 성능 데이터를 캡처했습니다. 이 데이터는 다음 시나리오에 설명된 대로 게스트 및 호스트 OS에서 모두 캡처되었습니다. 테스트 서버에는 게스트 OS로 Windows Server 2012 베타를 사용하는 4개의 동일한 가상 머신이 있습니다. 4개의 VM은 가상 스위치를 통해 10GB 네트워크에 연결됩니다. 이 테스트 구성은 그림 2에 나와 있습니다.
그림 2 : 테스트 구성
성능 데이터를 보여주기 전에 이 테스트에 사용되는 매우 중요한 매개 변수를 소개하는 것이 중요합니다. 안에
Microsoft Windows OS에는 DPC(Deferred Procedure Call)라는 시스템 메커니즘이 있어 우선 순위가 높은 작업(예:
인터럽트 핸들러(interrupt handler))을 사용하여 나중에 실행할 수 있도록 필수이지만 우선 순위가 낮은 작업을 연기할 수 있습니다. 이렇게 하면 장치 드라이버 및 기타 낮은 수준의 이벤트 소비자가 처리의 우선 순위가 높은 부분을 신속하게 수행하고 중요하지 않은 추가 처리를 더 낮은 우선 순위로 실행하도록 예약할 수 있습니다.
시나리오 1 - 가상 머신(게스트 OS)의 성능 결과:
이 시나리오에서는 4개의 VM(가상 머신)을 사용했습니다(VM 1부터 VM 4까지). VM 설정에서 "SR-IOV 사용" 옵션을 선택하여 VM 1과 VM 2에서 SR-IOV를 사용하도록 설정하고, VM 3과 VM 4에서 SR-IOV를 사용하지 않도록 설정했습니다(동일한 옵션을 선택 취소). 따라서 그림 2와 같이 VM 1과 VM 2는 가상 함수(인텔 어댑터에 의해 노출됨)를 사용하는 반면, VM 3과 VM 4는 모든 네트워크 통신에 가상 경로(VMBus)를 사용합니다.
단일 SMB 공유에서 VM으로 데이터(20GB 크기)를 복사하기 시작하고 게스트 OS에서 시스템 CPU 사용량 로그를 캡처했습니다.
그림 3 : 가상 머신
의 DPC CPU 사용량 그림 3에서 SR-IOV는 VM-1 및 VM-2의 평균 DPC CPU 사용량을 나타내고 비 SR-IOV는 VM-3 및 VM-4의 평균 DPC CPU 사용량을 나타냅니다. 그래프를 보면 두 경우 간의 CPU 사용량에 큰 차이가 없지만 아직 호스트 컴퓨터의 CPU 사용량을 고려하지 않은 것을 알 수 있습니다.
시나리오 2 – 호스트 머신(호스트 OS)의 성능 결과:
이 시나리오에서는 하나의 가상 머신을 사용했다. SMB 공유에서 VM으로 데이터(20GB 크기)를 복사하기 시작하고 네트워크 I/O에 사용되는 NDIS와 VMBUS라는 2개 모듈의 DPC CPU 사용량을 캡처했습니다.
그림 4 : 호스트 머신
의 DPC CPU 사용량 결과는 그림 4에 나와 있습니다. 예상대로 두 경우(SR-IOV 및 비 SR-IOV) 간의 CPU 사용량에는 큰 차이가 있습니다. CPU 사용량은 SR-IOV의 경우 102, 비 SR-IOV의 경우 103 - 104입니다. 이는 주로 SR-IOV의 경우 가상 머신이 가상 기능을 통해 물리적 NIC와 직접 통신하기 때문입니다. 따라서 호스트의 CPU 주기는 네트워크 패킷을 처리하는 데 사용되지 않습니다. 비 SR-IOV(그림 1 참조)의 경우 게스트 OS는 VM 버스를 통해 호스트 OS와 통신하며, VM 버스는 패킷을 처리하여 물리적 NIC를 통해 보냅니다. 따라서 VM 버스 및 NDIS와 같은 모듈이 광범위하게 사용됩니다.
총 CPU 사용량을 계산할 때 SR-IOV를 사용할 때 네트워크 I/O 중 CPU 사용률이 훨씬 적다는 것을 알 수 있습니다. 따라서 SR-IOV를 사용하도록 설정된 Windows Server 2012 베타는 고객이 네트워크 I/O 중에 CPU 오버헤드를 줄여 전반적인 시스템 성능을 향상시키는 데 도움이 됩니다.
PowerShell을 사용하여 SR-IOV 구성
다음 PowerShell 명령을 사용하여 SR-IOV를 사용하도록 설정된 새 가상 스위치를 만들고 가상 스위치를 기존 가상 머신의 가상 네트워크 어댑터에 연결할 수 있습니다.
참고: 다음 명령을 실행하기 전에 BIOS에서 다음 옵션을 활성화해야 합니다.
(단일 네트워크 어댑터(Intel X520)가 연결되어 있다고 가정)
$NetAdap = Get-NetAdapter | where-object { $_입니다. Status -eq "Up"}
(The -EnableIov switch is used to enable SR-IOV in the virtual switch)
New-VMSwitch -Name "SRIOV Switch" -NetAdapterName $NetAdap.Name -AllowManagementOS $True -Notes "SRIOV Switch on X520" -EnableIov $True$VMSw
= Get-VMSwitch
VM-1에 새 네트워크 어댑터를 추가하고 가상 스위치에 연결합니다.
Add-VMNetworkAdapter -SwitchName $VMSw.Name -VMName VM-1 -Name "SRIOV Adapter"
참고: 이 명령이 작동하려면 VM을 꺼야 함)
다음 명령을 사용하여 이미 존재하는 VM 네트워크 어댑터를 사용할 수도 있습니다)
$VMNet = Get-VMNetworkAdapter -VMName VM-1
Connect-VMNetworkAdapter -VMName VM-1 -SwitchName $VMSw.Name -Name $VMNet.Name
각 VM 네트워크 어댑터에는 각각 SR-IOV 및 VMQ에 해당하는 IovWeight 및 VmqWeight의 두 가지 속성이 있습니다. 이러한 가중치를 조정하면 기능이 활성화되거나 비활성화됩니다.