Powershell을 이용한 Hyper-v 클러스터 호스트의 CPU 및 메모리 확인하기

최근 Hyper-v 클러스터에 소속된 호스트의 CPU 및 메모리에 대한 문제가 있어 확인을 하는 작업이 필요해졌습니다. 물론 SCVMM(System Center Virtual Machine Manager)을 이용하면 GUI로 손쉽게 볼 수 있지만, 한번에 데이터를 뽑아서 TXT 혹은 CSV 형태로 뽑아내고자 했다.

# Hyper-v 클러스터가 여러개 운영하고 있을 경우에 특정한 클러스터만 자료를 뽑을 수 있도록 인자값을 받아 변수로 지정할 수 있도록 설정
# 미 입력시 전체 클러스터가 조회된다
Param ( 
  [Parameter(Mandatory=$False)] [String]$ClusterName = '*'
)

# 앞서 받은 변수를 통해 SCVMM에 존재하는 클러스터 중 인자값에 지정된 클러스터만 뽑아낸다
$VMHosts = (Get-SCVMHost | Where-Object {$_.HostCluster -like $ClusterName})

# 가공하는 자료를 저장하는 변수에 대해 초기화 한다
$callHosts = @()

# 클러스터에 소속된 Hyper-v 호스트들에 대해 순차적으로 자료를 추출한다.
foreach ($VMHost in $VMHosts)
{
    # 물리메모리를 추출하기 위해 정보를 조회한다.
    $HostHW = Get-WmiObject Win32_ComputerSystem -ComputerName ($VMHost.Name)
    # 자료를 추출하기위해 임의의 임시 저장소를 만든다.
    $objHost = New-Object System.Object
    # 클러스터에서 Host 이름을 추출한다.
    $objHost | Add-Member -MemberType NoteProperty -Name HostName -Value $VMHost.ComputerName
    # Host의 클러스터 상태를 추출한다.
    $objHost | Add-Member -MemberType NoteProperty -Name HostState -Value $VMHost.ClusterNodeStatus
    # CPU 사용량(%)를 추출한다.
    $objHost | Add-Member -MemberType NoteProperty -Name CPUUsing -Value $VMHost.CpuUtilization
    # 논리 프로세스의 숫자를 추출한다.
    $objHost | Add-Member -MemberType NoteProperty -Name LogicalProcessorCount -Value $VMHost.LogicalProcessorCount
    # 물리 메모리의 총 용량을 추출한다.
    $objHost | Add-Member -MemberType NoteProperty -Name TotalMemory -Value $HostHW.TotalPhysicalMemory
    # 여유 메모리를 추출한다.
    $objHost | Add-Member -MemberType NoteProperty -Name AvailableMemory -Value $VMHost.AvailableMemory
    # Host OS가 설정한 예약메모리를 추출한다.
    $objHost | Add-Member -MemberType NoteProperty -Name MemoryReserve -Value $VMHost.MemoryReserveMB
    # 추출한 자료를 callHosts로 입력한다.
    $callHosts += $objHost
}

# 추출한 자료를 추가 가공을 하기위해 임의의 변수로 설정 및 저장한다.
# 호스트 이름은 그대로...
$a = @{Expression={$_.HostName};Label='HostName'}, `
     # 클러스터 상태도 그대로...
     @{Expression={$_.HostState};Label='HostState'}, `
     # CPU 사용량은 표기시 뒤에 %로 붙도록 설정한다.
     @{Expression={$_.CPUUsing};Label='CPU Using';FormatString="{0:N1}%";align='right'}, `
     # 논리 프로세스의 수도 그대로...
     @{Expression={$_.LogicalProcessorCount};Label='LogicalProcessorCount';align='right'}, `
     # 전체 메모리도 그대로..
     @{Expression={($_.TotalMemory/1GB) -as [int]};Label='TotalMemory';FormatString="{0:N1}G";align='right'}, `
     # 사용 메모리는 전체메모리 - 야유 메모리 + 호스트 예약 메모리의 값으로..
     @{Expression={($_.TotalMemory/1GB) - ($_.AvailableMemory/1024) + ($_.MemoryReserve/1024) -as [int]};Label='UsingMemory';FormatString="{0:N1}G";align='right'}, `
     # 여유 메모리도 그대로..
     @{Expression={($_.AvailableMemory/1024) -as [int]};Label='AvailableMemory';FormatString="{0:N1}G";align='right'}, `
     # 호스트 예약 메모리도 그대로..
     @{Expression={($_.MemoryReserve/1024) -as [int]};Label='MemoryReserve';FormatString="{0:N1}G";align='right'}

"Select $ClusterName Cluster"
# 저장된 자료에 대해 추가 가공된 것으로 나타나도록 한다.
$callHosts | Format-Table $a -AutoSize

# 호스트의 CPU 사용률에 대해 평균값을 구한다.
"Host CPU Average(%)"
$callHosts | Measure-Object CPUUsing -Average | Format-Table Average -AutoSize

위와같이 스크립트를 저장하고, 호출해서 다음과 같이 입력하면 확인이 가능하다. 결과값의 경우 노출되면 안되는 정보일 것 같아 - 로 표기를 해두었다.

C:\Get-HostRS.ps1 -ClusterName *

Select ----* Cluster

HostName HostState CPU Using LogicalProcessorCount TotalMemory UsingMemory AvailableMemory MemoryReserve
-------- --------- --------- --------------------- ----------- ----------- --------------- -------------
-------    Running     25.0%                    --      --7.0G      --8.0G          --0.0G          2.0G
-------    Running     23.0%                    --      --7.0G      --8.0G          --0.0G          2.0G
-------    Running     21.0%                    --      --7.0G      --2.0G          --7.0G          2.0G
-------    Running     33.0%                    --      --7.0G      --4.0G          --4.0G          2.0G
-------    Running     26.0%                    --      --7.0G      --4.0G          --4.0G          2.0G
-------    Running     25.0%                    --      --7.0G      --8.0G          --0.0G          2.0G
-------    Running     20.0%                    --      --7.0G      --3.0G          --6.0G          2.0G


Host CPU Average(%)

         Average
         -------
24.7142857142857