Windows Server 2008 network speed slow, Xen 3.4.3 HVM ISO

networkingwindows-server-2003windows-server-2008xen

I've setup a VM running Windows Server 2008 on a host node running Xen 3.4.3-5 and the following kernel: 2.6.18-308.1.1.el5xen #1 SMP Wed Mar 7 05:38:01 EST 2012 i686 i686 i386 GNU/Linux

The network speed on the VM is very slow–using the online speed tests I can only get it up to 8-9mbps. The line is 100mbps burstable and the host node has no problem achieving those speeds. If I setup a VM running CentOS (instead of Windows Server 2008), that CentOS VM has no problems achieving those speeds–only Win2K8 struggles.

I've done some pretty exhaustive troubleshooting, but nothing has helped:

  • New VM installations of Win2k8 do have the same network problem.
  • Upgrading to most recent kernel-xen did not help (2.6.18-308.1.1.el5xen).
  • Upgrading from xen 3.4.0 to xen 3.4.3-5 did not help.
  • Disabling Windows firewall, etc did not help.
  • Changing network card device config from auto negotiation to manual 100mbps full duplex did not help.
  • Changing the network receive buffer packet size did not help (tried all combos from 64k to 8k).

At this point I'm pretty much out of ideas–any help would be appreciated!

EDIT: I eventually resolved this problem. See my accepted answer below.

Best Answer

The problem is likely with the Windows guest and how it is communicating with the virtual NIC. Here are some things to try:

Disable TCP chimney offloading in the Windows guest. To determine if it is enabled run netsh int tcp show global. To disable it run netsh int tcp set global chimney=disabled

Disable TCP Offloading on the NIC in the Windows guest. In the guest Windows installation, go to device manager, open the NIC in question, go to the advanced tab and search for any option pertaining to TCP/UDP, checksum, largesend and/or TCP/IP offloading. Disable them. If it says "offloading" disable it.

Disable Receive Side Scaling in the Windows guest. Check if it is enabled with netsh int tcp show global. Disable it with netsh int tcp set global rss=disabled.

Disable NetDMA in the Windows guest. Check if it is enabled with netsh int tcp show global. To enable / disable it manually a registry key needs to be added. Check to see if it already exists with get-itemproperty -path HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters -name EnableTCPA. If it does not exist and NetDMA is enabled, create the following registry key with PowerShell:

New-Item -Path HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\EnableTCPA
New-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\" -Name "EnableTCPA" -Value 0 -PropertyType "DWord"

Disable Windows Network Task Offload in the Windows Guest. Check if the registry key exists using PowerShell: get-itemproperty -path HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters -name DisableTaskOffload. If it doesn't, add this registry key with PowerShell: New-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\" -Name "DisableTaskOffload" -Value 1 -PropertyType "DWord"

Disable Autotuning in the Windows Guest. Check first to see if it's enabled: Netsh interface tcp show global. If it is, disable it with: Netsh interface tcp set global autotuning=disabled

Disable Remote Differential Compression in the Windows Guest if it is enabled. Go to the run command and run appwiz.cpl, select "Turn Windows Features on or Off" and deselect remote differential compression.

Check if Anti-virus is set to scan live traffic. Antivirus tools can be set to scan all traffic coming and going from the host for anything malicious. If that is the case on your Windows guest, disable it temporarily to test.


EDIT 1

Some last ditch efforts on this include:

  • One of my guesses was that there was a port speed mismatch - but you addressed that. Unless there's more options you can frob with in this regard.
  • I usually recommend updating the network driver but this is less necessary in a VM since the virtual NIC is rather vanilla.
  • Install the latest guest tools into the Windows Guest.
  • I've seen some issues with IPv6 on Windows clients causing mysterious TCP/IP slowdowns. No idea why; I haven't researched it deeply. I suppose you could uninstall / remove v6 from the NIC.
  • Check TCP/IP stats in the Windows guest to see if there are lots of errors or other interesting numbers. netstat -es will do the trick.
  • Last, but certainly not least, install Network Monitor and inspect the traffic for anything unusual. CRC errors, reconnections, dropped packets... who knows. Anything that looks ugly.
Related Topic