Hyper-V Host Memory Utilization with PowerShell

Posted on September 24, 2015 by Jeff Hicks in Hyper-V, PowerShell with

Several weeks ago, I posted a PowerShell script on my blog that uses commands in the Hyper-V module to report on memory utilization per virtual machine. I rely heavily on virtualization to provide a complete domain environment since I work at home. At present, my workload is spread between laptop running 8GB of RAM and a Gigabyte Brix with 16GB of RAM. I’m in the process of planning for something new. But in the meantime, memory utilization, especially from the Hyper-V host perspective is important to me. So I thought I’d share with you some PowerShell-related suggestions that should give you a good idea of how much memory is being used and what virtual machine is using it.

I’m going to be querying my Hyper-V server from my desktop.

The first step I can take is to query WMI for the Win32_OperatingSystem. I’m using Get-CimInstance as I am trying to wean myself off of Get-WmiObject.

I’ve selected a few memory related properties.

Memory properties from the Win32_OperatingSystem class (Image Credit: Jeff Hicks)

Memory properties from the Win32_OperatingSystem class (Image Credit: Jeff Hicks)

The memory values are in KB. If I divide the number by 1KB that will give me the value in MB. If I divide by 1MB, I’ll get the value in GB. Here’s a more complete one-line command that also calculates utilization percentages.

A formatted display of memory properties (Image Credit: Jeff Hicks)

A formatted display of memory properties (Image Credit: Jeff Hicks)

As you can see, memory is getting pretty tight. What virtual machines are eating this memory up? To figure that out, I need to get all the currently running VMs.

How much memory is currently assigned?

Total assigned virtual machine memory (Image Credit: Jeff Hicks)

Total assigned virtual machine memory (Image Credit: Jeff Hicks)

But probably more important is how much memory is actually being demanded?

Total virtual machine memory demanded (Image Credit: Jeff Hicks)

Total virtual machine memory demanded (Image Credit: Jeff Hicks)

There is also a maximum memory, which would be a worst case scenario. Here’s a one-line approach to getting the value.

Potential maximum VM memory (Image Credit: Jeff Hicks)

Potential maximum VM memory (Image Credit: Jeff Hicks)

If all the current running VMs needed to use their maximum memory settings, they would need 23GB. That’s a problem because the server only has 16! Hopefully it won’t come to that. With this, I can create a custom object to display total virtual machine memory utilization.

A VM memory summary (Image Credit: Jeff Hicks)

A VM memory summary (Image Credit: Jeff Hicks)

Notice I’m not simply writing text to the screen I am using an object. This makes it much easier if I had multiple hosts to manage, or if I wanted to export to a CSV or something.

I can take this a step further and look at each running VM. Since I can get each machine’s assigned and demand memory, I can divide those values by the host’s available memory and calculate what percentage each VM is consuming.

I saved the results to a variable, so I could do different things with it like this:

VM utilization of host memory (Image Credit: Jeff Hicks)

VM utilization of host memory (Image Credit: Jeff Hicks)

Looks like my SQL Server needs some attention, or I could shut a few things down to free up resources.

In any event, I’ve given you several commands you could run to get a handle on memory utilization on the Hyper-V host. But personally, I’d prefer everything in one place. So I wrote a function that combines everything I’ve covered.

Now, I can get everything I need with a single command.

Getting Hyper-V host memory status (Image Credit: Jeff Hicks)

Getting Hyper-V host memory status (Image Credit: Jeff Hicks)

I modified the property names, as I thought they were getting a bit long for my tastes. The memory values are in GB. Details for each running virtual machine are stored in the VMs property. Because I used the common parameter Out-Variable, I can easily get that information without having to re-run the command.

Viewing VM memory details (Image Credit: Jeff Hicks)

Viewing VM memory details (Image Credit: Jeff Hicks)

Sponsored

Because everything is an object I can slice and dice the data anyway, I need or use any other PowerShell cmdlet. I hope you’ll let me know what you think. Now if you’ll excuse me, I think I have some virtual machines that need some attention.

Tagged with , , ,

Register for this Webinar

How Replication Supports Your Company’s RTOs & RPOs
Join us for this free webinar

Can you have your workloads running within the agreed RTOs? Join this webinar with expert speakers from Veeam to exceed business objectives with an RPTO<15 min for ALL of your application and data.

Thursday, December 14, 2017 at 11 a.m EST