최근 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