Virtual Machine 리소스 컨트롤

적용 대상: Windows Server 2022, Windows Server 2016, Microsoft Hyper-V Server 2016, Windows Server 2019, Microsoft Hyper-V Server 2019

이 문서에서는 가상 머신에 대한 Hyper-V 리소스 및 격리 컨트롤에 대해 설명합니다. 가상 머신 CPU 그룹 또는 "CPU 그룹"이라고 하는 이러한 기능은 Windows Server 2016에서 도입되었습니다. CPU 그룹을 사용하면 Hyper-V 관리자가 게스트 가상 머신에서 호스트의 CPU 리소스를 더 잘 관리하고 할당할 수 있습니다. HYPER-V 관리자는 CPU 그룹을 사용하여 다음을 수행할 수 있습니다.

  • 각 그룹이 전체 그룹에서 공유되는 가상화 호스트의 총 CPU 리소스 할당이 서로 다른 가상 머신 그룹을 만듭니다. 이렇게 하면 호스트 관리자가 다양한 유형의 VM에 대한 서비스 클래스를 구현할 수 있습니다.

  • CPU 리소스 제한을 특정 그룹으로 설정합니다. 이 "그룹 상한"은 전체 그룹이 사용할 수 있는 호스트 CPU 리소스의 상한을 설정하여 해당 그룹에 대해 원하는 서비스 클래스를 효과적으로 적용합니다.

  • 특정 호스트 시스템 프로세서 집합에서만 실행되도록 CPU 그룹을 제한합니다. 서로 다른 CPU 그룹에 속하는 VM을 서로 격리하는 데 사용할 수 있습니다.

CPU 그룹 관리

CPU 그룹은 Hyper-V 호스트 컴퓨팅 서비스 또는 HCS를 통해 관리됩니다. HCS, 그 기원, HCS API에 대한 링크 등에 대한 훌륭한 설명은 HCS(호스트 컴퓨팅 서비스) 소개 게시물의 Microsoft Virtualization 팀 블로그에서 확인할 수 있습니다.

참고 항목

HCS만 CPU 그룹을 만들고 관리하는 데 사용할 수 있습니다. Hyper-V 관리자 애플릿, WMI 및 PowerShell 관리 인터페이스는 CPU 그룹을 지원하지 않습니다.

Microsoft는 HCS 인터페이스를 사용하여 CPU 그룹을 관리하는 명령줄 유틸리티인 cpugroups.exe를 Microsoft 다운로드 센터에 제공합니다. 이 유틸리티는 호스트의 CPU 토폴로지도 표시할 수 있습니다.

CPU 그룹의 작동 방식

CPU 그룹 간에 호스트 컴퓨팅 리소스의 할당은 계산된 CPU 그룹 한도를 사용하여 Hyper-V 하이퍼바이저에 의해 적용됩니다. CPU 그룹 한도는 CPU 그룹에 대한 총 CPU 용량의 일부입니다. 그룹 한도의 값은 그룹 클래스 또는 할당된 우선 순위 수준에 따라 달라집니다. 계산된 그룹 한도는 "많은 LP의 CPU 시간"으로 간주할 수 있습니다. 이 그룹 예산은 공유되므로 단일 VM만 활성화된 경우 전체 그룹의 CPU 할당을 자체적으로 사용할 수 있습니다.

CPU 그룹 한도는 G = n x C로 계산됩니다. 여기서는 다음을 수행합니다.

  • G 는 그룹에 할당하려는 호스트 LP의 양입니다.
  • n 은 그룹의 총 논리 프로세서 수(LP)입니다.
  • C 는 최대 CPU 할당입니다. 즉, 시스템에 대해 원하는 서비스 클래스이며 시스템 총 컴퓨팅 용량의 백분율로 표현됩니다.

예를 들어 4개의 LP(논리 프로세서) 및 50%의 상한으로 구성된 CPU 그룹을 고려해 보세요.

  • G = n * C
  • G = 4 * 50%
  • G = 전체 그룹에 대한 2LP의 CPU 시간

이 예제에서는 CPU 그룹 G에 2LP의 CPU 시간이 할당됩니다.

그룹 한도는 그룹에 바인딩된 가상 머신 또는 가상 프로세서의 수와 CPU 그룹에 할당된 가상 머신의 상태(예: 종료 또는 시작됨)에 관계없이 적용됩니다. 따라서 동일한 CPU 그룹에 바인딩된 각 VM은 그룹의 총 CPU 할당의 일부를 받게 되며 이는 CPU 그룹에 바인딩된 VM 수에 따라 변경됩니다. 따라서 VM이 CPU 그룹에서 바인딩되거나 바인딩되지 않은 VM이므로 전체 CPU 그룹 한도를 다시 조정하고 원하는 결과 VM당 상한을 기본 설정해야 합니다. VM 호스트 관리자 또는 가상화 관리 소프트웨어 계층은 필요한 VM당 CPU 리소스 할당을 달성하기 위해 필요에 따라 그룹 한도를 관리합니다.

서비스 클래스 예제

몇 가지 간단한 예제를 살펴보겠습니다. 먼저 Hyper-V 호스트 관리자가 게스트 VM에 대해 두 가지 서비스 계층을 지원하려고 하는 것으로 가정합니다.

  1. 저가형 "C" 계층입니다. 이 계층은 전체 호스트의 컴퓨팅 리소스 중 10%를 제공합니다.

  2. 중간 범위 "B" 계층입니다. 이 계층은 전체 호스트의 컴퓨팅 리소스 중 50%가 할당됩니다.

이 예제에서는 개별 VM 캡, 가중치 및 예약과 같은 다른 CPU 리소스 컨트롤이 사용되지 않는다고 어설션합니다. 그러나 개별 VM 대문자는 약간 나중에 볼 수 있으므로 중요합니다.

간단히 하기 위해 각 VM에 1개의 VP가 있고 호스트에 8개의 LP가 있다고 가정해 보겠습니다. 빈 호스트로 시작합니다.

"B" 계층을 만들려면 호스트 관리자가 그룹 한도를 50%로 설정합니다.

  • G = n * C
  • G = 8 * 50%
  • G = 전체 그룹에 대한 4LP의 CPU 시간

호스트 관리자는 단일 "B" 계층 VM을 추가합니다. 이 시점에서 "B" 계층 VM은 호스트 CPU의 최대 50% 가치 또는 예제 시스템에서 4개의 LP에 해당하는 값을 사용할 수 있습니다.

이제 관리자는 두 번째 "계층 B" VM을 추가합니다. CPU 그룹의 할당은 모든 VM 간에 균등하게 분할됩니다. 그룹 B에는 총 2개의 VM이 있으므로 각 VM은 이제 B 그룹 총계의 절반인 50%, 25% 또는 2LP에 해당하는 컴퓨팅 시간을 얻습니다.

개별 VM에서 CPU Caps 설정

그룹 한도 외에도 각 VM에는 개별 "VM 캡"이 있을 수 있습니다. CPU 한도, 가중치 및 예약을 포함한 VM당 CPU 리소스 컨트롤은 도입 이후 Hyper-V의 일부였습니다. 그룹 한도와 결합된 경우 VM 상한은 그룹에 사용 가능한 CPU 리소스가 있더라도 각 VP가 가져올 수 있는 최대 CPU 양을 지정합니다.

예를 들어 호스트 관리자는 "C" VM에 10% VM 한도를 배치하려고 할 수 있습니다. 이렇게 하면 대부분의 "C" VP가 유휴 상태이더라도 각 VP는 10%를 초과할 수 없습니다. VM 상한이 없으면 "C" VM은 계층에서 허용하는 수준을 초과하는 성능을 기회적으로 달성할 수 있습니다.

VM 그룹을 특정 호스트 프로세서로 격리

Hyper-V 호스트 관리자는 컴퓨팅 리소스를 VM에 헌정하는 기능을 원할 수도 있습니다. 예를 들어 관리자가 클래스 한도가 100%인 프리미엄 "A" VM을 제공하고 싶다고 상상해 보십시오. 또한 이러한 프리미엄 VM에는 가능한 가장 낮은 예약 대기 시간과 지터가 필요합니다. 즉, 다른 VM에서 예약을 해제하지 않을 수 있습니다. 이러한 분리를 위해 특정 LP 선호도 매핑을 사용하여 CPU 그룹을 구성할 수도 있습니다.

예를 들어 이 예제에서 호스트의 "A" VM에 맞게 관리자는 새 CPU 그룹을 만들고 그룹의 프로세서 선호도를 호스트의 LP 하위 집합으로 설정합니다. B 및 C 그룹은 다시 기본 LP로 선호됩니다. 관리자는 그룹 A에서 단일 VM을 만들 수 있습니다. 그러면 그룹 A의 모든 LP에 대한 단독 액세스 권한이 있는 반면, 하위 계층 그룹 B와 C는 다시 기본 LP를 공유할 수 있습니다.

게스트 VP에서 루트 VP 분리

기본적으로 Hyper-V는 각 기본 물리적 LP에 루트 VP를 만듭니다. 이러한 루트 VP는 시스템 LP와 1:1로 엄격하게 매핑되며 마이그레이션하지 않습니다. 즉, 각 루트 VP는 항상 동일한 실제 LP에서 실행됩니다. 게스트 VP는 사용 가능한 모든 LP에서 실행될 수 있으며 루트 VP와 실행을 공유합니다.

그러나 루트 VP 작업을 게스트 VP와 완전히 분리하는 것이 좋습니다. 프리미엄 "A" 계층 VM을 구현하는 위의 예제를 살펴보겠습니다. "A" VM의 VP가 가능한 대기 시간 및 "지터" 또는 예약 변형을 갖도록 하기 위해 전용 LP 집합에서 실행하여 루트가 이러한 LP에서 실행되지 않도록 합니다.

이 작업은 호스트 OS 파티션이 하나 이상의 선호도 CPU 그룹과 함께 전체 시스템 논리 프로세서의 하위 집합에서 실행되도록 제한하는 "minroot" 구성의 조합을 사용하여 수행할 수 있습니다.

가상화 호스트는 호스트 파티션을 특정 LP로 제한하도록 구성할 수 있으며, 하나 이상의 CPU 그룹이 다시 기본 LP로 선호됩니다. 이러한 방식으로 루트 및 게스트 파티션은 CPU 공유 없이 전용 CPU 리소스에서 실행되고 완전히 격리될 수 있습니다.

"minroot" 구성에 대한 자세한 내용은 Hyper-V 호스트 CPU 리소스 관리를 참조 하세요.

CpuGroups 도구 사용

CpuGroups 도구를 사용하는 방법에 대한 몇 가지 예제를 살펴보겠습니다.

참고 항목

CpuGroups 도구에 대한 명령줄 매개 변수는 공백만 구분 기호로 사용하여 전달됩니다. '/' 또는 '-' 문자는 원하는 명령줄 스위치를 진행해야 합니다.

CPU 토폴로지 검색

GetCpuTopology를 사용하여 CpuGroups를 실행하면 아래와 같이 LP 인덱스, LP가 속한 NUMA 노드, 패키지 및 코어 ID 및 ROOT VP 인덱스를 포함하여 현재 시스템에 대한 정보가 반환됩니다.

다음 예제에서는 2개의 CPU 소켓 및 NUMA 노드, 총 32개의 LP 및 다중 스레딩을 사용하도록 설정하고 각 NUMA 노드에서 4개 루트 VP가 있는 Minroot를 사용하도록 구성된 시스템을 보여 줍니다. 루트 VP가 있는 LP에는 RootVpIndex >= 0; RootVpIndex가 -1인 LP는 루트 파티션에서 사용할 수 없지만 하이퍼바이저에서 계속 관리되며 다른 구성 설정에서 허용하는 대로 게스트 VP를 실행합니다.

C:\vm\tools>CpuGroups.exe GetCpuTopology

LpIndex NodeNumber PackageId CoreId RootVpIndex
------- ---------- --------- ------ -----------
      0          0         0      0           0
      1          0         0      0           1
      2          0         0      1           2
      3          0         0      1           3
      4          0         0      2          -1
      5          0         0      2          -1
      6          0         0      3          -1
      7          0         0      3          -1
      8          0         0      4          -1
      9          0         0      4          -1
     10          0         0      5          -1
     11          0         0      5          -1
     12          0         0      6          -1
     13          0         0      6          -1
     14          0         0      7          -1
     15          0         0      7          -1
     16          1         1     16           4
     17          1         1     16           5
     18          1         1     17           6
     19          1         1     17           7
     20          1         1     18          -1
     21          1         1     18          -1
     22          1         1     19          -1
     23          1         1     19          -1
     24          1         1     20          -1
     25          1         1     20          -1
     26          1         1     21          -1
     27          1         1     21          -1
     28          1         1     22          -1
     29          1         1     22          -1
     30          1         1     23          -1
     31          1         1     23          -1

예제 2 – 호스트의 모든 CPU 그룹 인쇄

여기서는 현재 호스트의 모든 CPU 그룹, GroupId, 그룹의 CPU 한도 및 해당 그룹에 할당된 LP의 인덱스를 나열합니다.

유효한 CPU 상한 값은 [0, 65536] 범위에 있으며 이러한 값은 그룹 상한을 백분율(예: 32768 = 50%)으로 표시합니다.

C:\vm\tools>CpuGroups.exe GetGroups

CpuGroupId                          CpuCap  LpIndexes
------------------------------------ ------ --------
36AB08CB-3A76-4B38-992E-000000000002 32768  4,5,6,7,8,9,10,11,20,21,22,23
36AB08CB-3A76-4B38-992E-000000000003 65536  12,13,14,15
36AB08CB-3A76-4B38-992E-000000000004 65536  24,25,26,27,28,29,30,31

예제 3 – 단일 CPU 그룹 인쇄

이 예제에서는 GroupId를 필터로 사용하여 단일 CPU 그룹을 쿼리합니다.

C:\vm\tools>CpuGroups.exe GetGroups /GroupId:36AB08CB-3A76-4B38-992E-000000000003
CpuGroupId                          CpuCap   LpIndexes
------------------------------------ ------ ----------
36AB08CB-3A76-4B38-992E-000000000003 65536  12,13,14,15

예제 4 – 새 CPU 그룹 만들기

여기서는 그룹에 할당할 그룹 ID 및 LP 집합을 지정하는 새 CPU 그룹을 만듭니다.

C:\vm\tools>CpuGroups.exe CreateGroup /GroupId:36AB08CB-3A76-4B38-992E-000000000001 /GroupAffinity:0,1,16,17

이제 새로 추가된 그룹을 표시합니다.

C:\vm\tools>CpuGroups.exe GetGroups
CpuGroupId                          CpuCap LpIndexes
------------------------------------ ------ ---------
36AB08CB-3A76-4B38-992E-000000000001 65536 0,1,16,17
36AB08CB-3A76-4B38-992E-000000000002 32768 4,5,6,7,8,9,10,11,20,21,22,23
36AB08CB-3A76-4B38-992E-000000000003 65536 12,13,14,15
36AB08CB-3A76-4B38-992E-000000000004 65536 24,25,26,27,28,29,30,31

예제 5 – CPU 그룹 한도를 50%로 설정

여기서는 CPU 그룹 한도를 50%로 설정합니다.

C:\vm\tools>CpuGroups.exe SetGroupProperty /GroupId:36AB08CB-3A76-4B38-992E-000000000001 /CpuCap:32768

이제 방금 업데이트한 그룹을 표시하여 설정을 확인해 보겠습니다.

C:\vm\tools>CpuGroups.exe GetGroups /GroupId:36AB08CB-3A76-4B38-992E-000000000001

CpuGroupId                          CpuCap LpIndexes
------------------------------------ ------ ---------
36AB08CB-3A76-4B38-992E-000000000001 32768 0,1,16,17

예제 6 – 호스트의 모든 VM에 대한 CPU 그룹 ID 인쇄

C:\vm\tools>CpuGroups.exe GetVmGroup

VmName                                 VmId                           CpuGroupId
------ ------------------------------------ ------------------------------------
    G2 4ABCFC2F-6C22-498C-BB38-7151CE678758 36ab08cb-3a76-4b38-992e-000000000002
    P1 973B9426-0711-4742-AD3B-D8C39D6A0DEC 36ab08cb-3a76-4b38-992e-000000000003
    P2 A593D93A-3A5F-48AB-8862-A4350E3459E8 36ab08cb-3a76-4b38-992e-000000000004
    G3 B0F3FCD5-FECF-4A21-A4A2-DE4102787200 36ab08cb-3a76-4b38-992e-000000000002
    G1 F699B50F-86F2-4E48-8BA5-EB06883C1FDC 36ab08cb-3a76-4b38-992e-000000000002

예제 7 – CPU 그룹에서 VM 바인딩 해제

CPU 그룹에서 VM을 제거하려면 VM의 CpuGroupId를 NULL GUID로 설정합니다. 이렇게 하면 CPU 그룹에서 VM의 바인딩이 해제됩니다.

C:\vm\tools>CpuGroups.exe SetVmGroup /VmName:g1 /GroupId:00000000-0000-0000-0000-000000000000

C:\vm\tools>CpuGroups.exe GetVmGroup
VmName                                 VmId                           CpuGroupId
------ ------------------------------------ ------------------------------------
    G2 4ABCFC2F-6C22-498C-BB38-7151CE678758 36ab08cb-3a76-4b38-992e-000000000002
    P1 973B9426-0711-4742-AD3B-D8C39D6A0DEC 36ab08cb-3a76-4b38-992e-000000000003
    P2 A593D93A-3A5F-48AB-8862-A4350E3459E8 36ab08cb-3a76-4b38-992e-000000000004
    G3 B0F3FCD5-FECF-4A21-A4A2-DE4102787200 36ab08cb-3a76-4b38-992e-000000000002
    G1 F699B50F-86F2-4E48-8BA5-EB06883C1FDC 00000000-0000-0000-0000-000000000000

예제 8 – 기존 CPU 그룹에 VM 바인딩

여기서는 기존 CPU 그룹에 VM을 추가합니다. VM은 기존 CPU 그룹에 바인딩되지 않아야 합니다. 그렇지 않으면 CPU 그룹 ID 설정이 실패합니다.

C:\vm\tools>CpuGroups.exe SetVmGroup /VmName:g1 /GroupId:36AB08CB-3A76-4B38-992E-000000000001

이제 VM G1이 원하는 CPU 그룹에 있는지 확인합니다.

C:\vm\tools>CpuGroups.exe GetVmGroup
VmName                                 VmId                           CpuGroupId
------ ------------------------------------ ------------------------------------
    G2 4ABCFC2F-6C22-498C-BB38-7151CE678758 36ab08cb-3a76-4b38-992e-000000000002
    P1 973B9426-0711-4742-AD3B-D8C39D6A0DEC 36ab08cb-3a76-4b38-992e-000000000003
    P2 A593D93A-3A5F-48AB-8862-A4350E3459E8 36ab08cb-3a76-4b38-992e-000000000004
    G3 B0F3FCD5-FECF-4A21-A4A2-DE4102787200 36ab08cb-3a76-4b38-992e-000000000002
    G1 F699B50F-86F2-4E48-8BA5-EB06883C1FDC 36AB08CB-3A76-4B38-992E-000000000001

예제 9 – CPU 그룹 ID별로 그룹화된 모든 VM 인쇄

C:\vm\tools>CpuGroups.exe GetGroupVms
CpuGroupId                           VmName                                 VmId
------------------------------------ ------ ------------------------------------
36AB08CB-3A76-4B38-992E-000000000001     G1 F699B50F-86F2-4E48-8BA5-EB06883C1FDC
36ab08cb-3a76-4b38-992e-000000000002     G2 4ABCFC2F-6C22-498C-BB38-7151CE678758
36ab08cb-3a76-4b38-992e-000000000002     G3 B0F3FCD5-FECF-4A21-A4A2-DE4102787200
36ab08cb-3a76-4b38-992e-000000000003     P1 973B9426-0711-4742-AD3B-D8C39D6A0DEC
36ab08cb-3a76-4b38-992e-000000000004     P2 A593D93A-3A5F-48AB-8862-A4350E3459E8

예제 10 – 단일 CPU 그룹에 대한 모든 VM 인쇄

C:\vm\tools>CpuGroups.exe GetGroupVms /GroupId:36ab08cb-3a76-4b38-992e-000000000002

CpuGroupId                           VmName                                VmId
------------------------------------ ------ ------------------------------------
36ab08cb-3a76-4b38-992e-000000000002     G2 4ABCFC2F-6C22-498C-BB38-7151CE678758
36ab08cb-3a76-4b38-992e-000000000002     G3 B0F3FCD5-FECF-4A21-A4A2-DE4102787200

예제 11 – 비어있지 않은 CPU 그룹을 삭제하려고 시도함

빈 CPU 그룹(즉, 바인딩된 VM이 없는 CPU 그룹)만 삭제할 수 있습니다. 비어있지 않은 CPU 그룹을 삭제하려고 하면 실패합니다.

C:\vm\tools>CpuGroups.exe DeleteGroup /GroupId:36ab08cb-3a76-4b38-992e-000000000001
(null)
Failed with error 0xc0350070

예제 12 – CPU 그룹에서 유일한 VM 바인딩 해제 및 그룹 삭제

이 예제에서는 여러 명령을 사용하여 CPU 그룹을 검사하고, 해당 그룹에 속한 단일 VM을 제거한 다음, 그룹을 삭제합니다.

먼저 그룹의 VM을 열거해 보겠습니다.

C:\vm\tools>CpuGroups.exe GetGroupVms /GroupId:36AB08CB-3A76-4B38-992E-000000000001
CpuGroupId                           VmName                                VmId
------------------------------------ ------ ------------------------------------
36AB08CB-3A76-4B38-992E-000000000001     G1 F699B50F-86F2-4E48-8BA5-EB06883C1FDC

G1이라는 단일 VM만 이 그룹에 속하는 것을 볼 수 있습니다. VM의 그룹 ID를 NULL로 설정하여 그룹에서 G1 VM을 제거해 보겠습니다.

C:\vm\tools>CpuGroups.exe SetVmGroup /VmName:g1 /GroupId:00000000-0000-0000-0000-000000000000

그리고 우리의 변화를 확인 ...

C:\vm\tools>CpuGroups.exe GetVmGroup /VmName:g1
VmName                                 VmId                           CpuGroupId
------ ------------------------------------ ------------------------------------
    G1 F699B50F-86F2-4E48-8BA5-EB06883C1FDC 00000000-0000-0000-0000-000000000000

이제 그룹이 비어 있으므로 안전하게 삭제할 수 있습니다.

C:\vm\tools>CpuGroups.exe DeleteGroup /GroupId:36ab08cb-3a76-4b38-992e-000000000001

그리고 우리 그룹이 사라졌는지 확인합니다.

C:\vm\tools>CpuGroups.exe GetGroups
CpuGroupId                          CpuCap                     LpIndexes
------------------------------------ ------ -----------------------------
36AB08CB-3A76-4B38-992E-000000000002 32768  4,5,6,7,8,9,10,11,20,21,22,23
36AB08CB-3A76-4B38-992E-000000000003 65536  12,13,14,15
36AB08CB-3A76-4B38-992E-000000000004 65536 24,25,26,27,28,29,30,31

예제 13 – VM을 원래 CPU 그룹에 다시 바인딩

C:\vm\tools>CpuGroups.exe SetVmGroup /VmName:g1 /GroupId:36AB08CB-3A76-4B38-992E-000000000002

C:\vm\tools>CpuGroups.exe GetGroupVms
CpuGroupId VmName VmId
------------------------------------ -------------------------------- ------------------------------------
36ab08cb-3a76-4b38-992e-000000000002 G2 4ABCFC2F-6C22-498C-BB38-7151CE678758
36ab08cb-3a76-4b38-992e-000000000002 G3 B0F3FCD5-FECF-4A21-A4A2-DE4102787200
36AB08CB-3A76-4B38-992E-000000000002 G1 F699B50F-86F2-4E48-8BA5-EB06883C1FDC
36ab08cb-3a76-4b38-992e-000000000003 P1 973B9426-0711-4742-AD3B-D8C39D6A0DEC
36ab08cb-3a76-4b38-992e-000000000004 P2 A593D93A-3A5F-48AB-8862-A4350E3459E8