5

We just put our first Hyper-V based web solution online about a month ago (Diagram below). We're having intermittent communication issues between Virtual Machines during periods of elevated traffic, for example, during Bing/Google/Baidu/McAfee Secure/etc crawls. The issue lasts a couple minutes and it is not a full blown outage; some requests work perfectly fine while others result in errors. I've looked in the system logs on the VMs and host system but there's nothing indicating failure (other than some ASP.net ODBC errors on the Web VM because it can't reach the database host).

Network Diagram

Our old setup with a single 8-year old Windows Server 2k3 web and database server handled all the traffic without a problem, but was limiting our new development abilities. It only had 4GB of RAM and an old 2GHz dual-core processor. Our new server has 32GB of RAM and a quad-core 3.4GHz Xeon. The hardware blows the old stuff out of the water when everything is working. Pages load faster, queries run faster, etc.

The only things I can think of are that traffic is essentially doubled-up on the adapter because the DB and Web are on seperate VMs but share the same Virtual Network, or, there may be a problem with the way our Hyper-V network is configured.

There is a single shared Virtual Switch set up as External. We use a hardware firewall to block ports to the outside world. I've included screenshots of the Network Adapters and current Virtual Switch setup.

I'm not sure which properties should be enabled/disabled on the Host and VMs. The machine has 2 nics, but everything is currently set up on one port. It's been recommended to use one port for admin and the other for the virtual switch, which I'm sure would increase performance when we log into the boxes, but I'm not sure that fixes the current issue.

Can anyone provide guidance on what the Nic properties should be on the host and VMs, or guide me to tweaks to boost network performance?

Network Adapters

enter image description here

8
  • By the way, I've Googled and found things like the Virtual Networking Survival Guide and such. The most promising thing I found was disabling TCP Offloading, but I'm not sure what the ramifications of that would be or whether it should be done in the host, children, or both. Don't want to make things worse than they already are.
    – Sam
    Nov 27, 2013 at 17:16
  • 1
    that traffic is essentially doubled-up on the adapter ... - That isn't the case. Communication between VMs doesn't through the physical adapter.
    – Zoredache
    Nov 27, 2013 at 17:17
  • 1
    It's been recommended to use one port for admin and the other for the virtual switch - If you don't have multiple physical hyper-v servers and you don't migrate VMs, then I am of the opinion that you should just add those to both to a switch independent team that optimizes based on the hyper-v port. Then use the team adapter for your external vSwitch.
    – Zoredache
    Nov 27, 2013 at 17:20
  • Yeah I'm unsure of how to answer because I can't decide if you'd rather have general NIC configuration advice, or if you actually just want to solve this problem that you are having with inter-VM communication.
    – Ryan Ries
    Nov 27, 2013 at 17:32
  • Ryan, I'd like to solve the inter-VM communication problem. I'm assuming it is some kind of NIC/Hyper-V configuration that will get me there?
    – Sam
    Nov 27, 2013 at 18:25

2 Answers 2

2

In addition to the answer from Bartłomiej, I would also recommend changing the Team load balancing mode to Hyper-V port and set both adapters in the team to active:

enter image description here

This way you utilize both adapters in the team actively.

1

I would suggest setup all Hyper-V host networking from powershell not from GUI. The GUI does not give as much control as You would like to.

  1. clear all the VMswitches / VMAdapters You created. The physical network adapters should be the only one visible in ipconfig on the Hyper-V host (except the tunnel somehting adapters).
  2. rename You physical adapters to for example "Gi1" and "Gi2" (it will look more clear later what is what)
    • check card name - it may be something like "Ethernet 2": Get-NetAdapter
    • rename it: Rename-NetAdapter "Old name1" "Gi1"
    • rename the second one: Rename-NetAdapter "Old name2" "Gi2"
  3. create a switch independent team and check it

    • New-NetLbfoTeam -Name Team1 -TeamMembers Gi1,Gi2
    • check it - defaults should set a switchindependent Team.
     PS C:\> Get-NetLbfoTeam Team1
    
     Name                   : Team1  
     Members                : {Gi2, Gi1}  
     TeamNics               : Team1  
     TeamingMode            : SwitchIndependent  
     LoadBalancingAlgorithm : TransportPorts  
     Status                 : Up  
    
    • You should no longer see Gi1,Gi2 in ipconfig - just Team1 as an IP interface.
  4. create a VMswitch with Team1 connected to it.
    • New-VMSwitch -Name VMSwitch1 -NetAdapterName Team1
    • after that step check ipconfig. You should no longer see Team1 but VMswitch1 as IP interface of the Hyper-V host.
  5. create a virtual network adapter for management and connect it to the Vmswitch1
    • Add-VMNetworkAdapter -ManagementOS -VMNetworkAdapterName management -SwitchName VMswitch1
    • You should see now in ipconfig "Ethernet adapter vEthernet (management): ..."
  6. connect Your Virtual machines network adapters to VMSwitch1. This can be done from GUI.
  7. Final effect is clear:
    Final effect
  8. More Tweaks - But You should probably leave everything on default:
    • have a look at Get-NetAdapterAdvancedProperty
  9. Or maybe it is not a network problem with performance ?
    • what are your VHD / VHDX type used for the database ? Dynamic ? Fixed ?
    • integration tools installed / fully updated ?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.