Looking at Memory Usage on Hosts when Creating a New VM

In my house I have two Hyper-V servers running multiple virtual machines with dynamic memory enabled.  This can make it a bit tricky when I want to create a new virtual machine - and I need to figure out the best server to use.  Thankfully - this little bit of PowerShell comes to the rescue:

 "Hyper-V-1", "Hyper-V-2" | %{"Memory Available on " + $_ + " : " + ("{0:N2}" -f (((get-vmhost $_).MemoryCapacity / 1GB) - ((get-vm -computername $_ | measure MemoryAssigned -sum).sum / 1GB))).ToString() + " GB"}

"Hyper-V-1" and "Hyper-V-2" are the names of my hosts.  This snippet gets the total memory in each host, subtracts the memory currently being used by virtual machines, and shows the results.  Like this:

So I can see that Hyper-V-2 has more memory available right now.

This is obviously a simple approach (it does not account for changing memory demand) but it is quick and easy to do.

Cheers,
Ben

Comments

  • Anonymous
    August 21, 2014
    Thanks a lot. Helped me to get the information I needed

  • Anonymous
    August 21, 2014
    Ben, I was searching more and found a tool from which seems to be able doing same things via GUI: hyperv.veeam.com/free-task-manager-hyper-v-performance-monitoring Would you recommend it?

  • Anonymous
    September 07, 2014
    Hi Ben, Its really a good one. I tried to make it better by changing the input. Instead of giving each server name, We could use the cluster itself and fetch the cluster nodes through that. Made a quick sorting based on available memory. Also included the number of VMs on each host which also is a consideration while placing a new VM. (Get-ClusterNode -cluster ClusterName |Select Name, @{L="VMCount";E={(Get-VM -ComputerName $.name).count}}, @{L="AvailableMemory"; Expression={(Get-VMHOST $.Name).MemoryCapacity/1GB-(Get-VM -ComputerName $_.name |Measure-Object MemoryAssigned -Sum).sum/1GB}}|Sort-Object AvailableMemory -Descending) Cheers ! Shaba insidevirtualization.com