Summary: Microsoft Scripting Guy, Ed Wilson, talks about using Windows PowerShell 3.0 to do Hyper-V Resource Metering on Windows Server 2012.
Microsoft Scripting Guy, Ed Wilson, is here. Well, Charlotte looked like someone had taken a huge can of polyurethane and sprayed the entire city—multiple times. Ok, so it is sort of pretty the way the city glistens in the sun with a thick layer of ice encapsulating the city, but dude, it is dangerous. So, the Scripting Wife and I headed out to the beach. I am sitting in one of those funky coffee houses near the beach, writing my blog posting for today, watching the waves, the surf, and the sand with a nearly unobscured view.
Yes, the Carolina beaches are great in the winter—when there are very few tourists to clutter things. Some restaurants close for the “off season,” but Teresa and I have discovered those types of restaurants are not the sort that we like to eat in anyway. We prefer the small, family-owned restaurants that have been in business for 50 years, and because of the quality of their food, and their loyal customer base, they do just fine year round.
Checking on status of Resource Metering
Now, it is possible to use performance counters to see how a virtual machine performs. It is also possible to use performance counters to see how the host (the server that hosts the virtual machines) performs. In fact, I wrote an entire series of articles talking about using performance counters with Windows PowerShell (in fact, one of my talks at the PowerShell Summit will be on what I call PoshMon). What was missing was a way to view the resource consumption of the virtual machine related to the host. The Introduction to Resource Meteringblog post written by Lalithra Fernando on the Virtualization Blog is an excellent place to start. Lalithra also wrote a blog post called How to Use Resource Metering with PowerShell, which is also a good introduction.
Exam note One of the objectives on the Exam 70-140: Installing and Configuring Windows Server 2012is configure Resource Metering, and so if you are working on your new MCSE for Server Infrastructure, you will want to know this material. Of course, if you are running or thinking about running Hyper-V on Windows Server 2012, you will want to know this information as well.Like I said yesterday, I like the MCSE exams because they help me to come up to speed quickly on a new product by forcing me to learn about the new features.
So, the first thing I need to do is to check on the status of Resource Metering on my Hyper-V server. To do this, I use the Get-VM cmdlet from the Hyper-V module to return virtual machine objects, and I pipe these to the Select-Object cmdlet, and I choose the name and the ResourceMeteringEnabledproperties. This command is shown here along with the associated output from the command.
Note Keep in mind that the Get-VM and other cmdlets from the Hyper-V require admin rights to run, and therefore, if you are doing this on Windows 8, you will need to start Windows PowerShell with admin rights.
14:34 C:\> get-vm | select name, resourcemeteringenabled
Name ResourceMeteringEnabled
---- -----------------------
c1 False
C2 False
DC1 False
sql1 False
Enabling Resource Metering
Well, the next thing I need to do is to enable Resource Metering. To do this, I use the Enable-VMResourceMetering cmdlet. I can enable Resource Metering for a specific machine, such as for SQL1, by specifying the –VMName parameter. The command to do this is shown here (keep in mind that nothing returns from this command).
Enable-VMResourceMetering -VMName sql1
Exam ALERT The default parameter set for the Enable-VMResourceMetering is VMName, and therefore, you can simply supply the name of the virtual machine Enable-VMResourceMetering SQL1. But, there are three parameter sets: VMName, VM, and ResourcePoolName. To make matters worse, ResourcePoolName has an alias of Name. Keep in mind, VMName is the name of the virtual machine, VM is a virtual machine object (such as returned by Get-VM) and ResourcePoolName and Name are the names of virtual machine resource pools. There is no alias for VMName or VM. The following illustrates available parameter aliases.
15:31 C:\> gcm Enable-VMResourceMetering | select -expand parameters | % {$_.values} |
? aliases | select name, aliases
Name Aliases
---- -------
ResourcePoolName {Name}
Verbose {vb}
Debug {db}
ErrorAction {ea}
WarningAction {wa}
ErrorVariable {ev}
WarningVariable {wv}
OutVariable {ov}
OutBuffer {ob}
If I want to, I can enable Resource Metering on all of the virtual machines by piping the results from Get-VM to the Enable-VMResourceMetering cmdlet, as shown here.
get-vm | Enable-VMResourceMetering
Getting the Resource Metering report
To get the report of metered resources, use the Measure-VM cmdlet. The default parameter set is VMName, and therefore, the parameter can be left out. The VMName parameter accepts an array, and therefore, I can obtain information from more than one virtual machine at a given time.
The following illustrates obtaining Resource Metering reports from one and from two virtual machines. The syntax is shown here.
Measure-VM dc1
Note When a virtual machine is offline, it reports 0.
The following image illustrates using this command, as well as the command to measure two virtual machines.
Getting a metering report for all virtual machines
I can use the Get-VM cmdlet and pipe the returned VirtualMachine objects to the Measure-VM cmdlet to obtain a report on all of my virtual machines. The command is shown here.
get-vm | Measure-VM
The command and its output associated used to measure all virtual machines are shown in the image that follows.
But realize this IS Windows PowerShell, and therefore, everything is an object. This means I am not limited to the output appearing above. I use the Get-Member cmdlet (gm is an alias) to see what my options are. The command and its output are shown here.
16:02 C:\> get-vm | Measure-VM | gm -MemberType *property
TypeName: Microsoft.HyperV.PowerShell.VMMeteringReportForVirtualMachine
Name MemberType Definition
---- ---------- ----------
AvgCPU AliasProperty AvgCPU = AverageProcessorUsage
AvgRAM AliasProperty AvgRAM = AverageMemoryUsage
MaxRAM AliasProperty MaxRAM = MaximumMemoryUsage
MinRAM AliasProperty MinRAM = MinimumMemoryUsage
TotalDisk AliasProperty TotalDisk = TotalDiskAllocation
AverageMemoryUsage Property System.Nullable[int] AverageMemoryUsage...
AverageProcessorUsage Property System.Nullable[int] AverageProcessorUs...
ComputerName Property string ComputerName {get;}
MaximumMemoryUsage Property System.Nullable[int] MaximumMemoryUsage...
MeteringDuration Property System.Nullable[timespan] MeteringDurat...
MinimumMemoryUsage Property System.Nullable[int] MinimumMemoryUsage...
NetworkMeteredTrafficReport Property Microsoft.HyperV.PowerShell.VMPortAclMe...
TotalDiskAllocation Property System.Nullable[int] TotalDiskAllocatio...
VMId Property guid VMId {get;}
VMName Property string VMName {get;}
Sorting the output
I am not too impressed with the random order of the output. What I am concerned with is the amount of CPU utilization. So, I sort the output by AvgCPU (I know I can do this because of the output from the Get-Member cmdlet). Here is the command I use to sort the output by average CPU usage.
get-vm | Measure-VM | sort avgCPU -Descending
The command and its associated output are shown here.
Well, that is about it for now. I want to head down to the beach and take a few pictures before it gets too late. Join me tomorrow when I will continue this discussion about Hyper-V on Windows Server 2012.
I invite you to follow me on Twitter and Facebook. If you have any questions, send email to me at scripter@microsoft.com, or post your questions on the Official Scripting Guys Forum. See you tomorrow. Until then, peace.
Ed Wilson, Microsoft Scripting Guy