Diagnosing and Optimizing Performance Bottlenecks in Windows Server 2008 R2 RDS (Terminal Services) on VMware


2 views

When users report lagging/delay in Remote Desktop Services (Terminal Services) on Windows Server 2008 R2 SP1 hosted on VMware, we need to examine several critical components. The symptoms typically manifest as:

  • Input latency (mouse/keyboard response delays)
  • Screen refresh artifacts
  • Session freezes during high utilization

Create a custom perfmon data collector set with these key counters:

# PowerShell script to create monitoring session
$CounterList = @(
    "\Terminal Services\Active Sessions",
    "\Terminal Services\Inactive Sessions",
    "\Terminal Services\Total Sessions",
    "\Processor(_Total)\% Processor Time",
    "\Memory\Available MBytes",
    "\LogicalDisk(*)\Avg. Disk sec/Transfer",
    "\Network Interface(*)\Bytes Total/sec"
)

New-DataCollectorSet -Name "RDS_Perf_Monitor" -PerformanceCounter $CounterList -SampleInterval 30

For VMware-hosted RDS servers, verify these settings:

# Check VM resource allocation
Get-VM -Name YourRDSVM | Get-VMResourceConfiguration

# Recommended VMX parameters for RDS workloads
monitor_control.restrict_backdoor = "true"
isolation.tools.hgfs.disable = "true"
scsi0:0.virtualSSD = 1

RDP protocol is sensitive to network conditions. Implement these registry tweaks:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp]
"TCPInitialRTT"=dword:00007530
"MaxMonitors"=dword:00000004
"MaxXResolution"=dword:00000800
"MaxYResolution"=dword:00000600
"fEnableWinstation"=dword:00000001

Run storage latency tests during peak usage:

# Disk performance test
diskspd.exe -c1G -d60 -W30 -C30 -b8K -t2 -o2 -r -w40 -Sh testfile.dat

# Analyze results for:
# 1. IOPS capacity
# 2. Latency percentiles
# 3. Queue depth saturation

Optimize RDSH host settings with these PowerShell commands:

# Disable unnecessary visual effects
Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name "DragFullWindows" -Value "0"
Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name "MenuShowDelay" -Value "10"
Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name "UserPreferencesMask" -Value ([byte[]](0x90,0x12,0x03,0x80,0x10,0x00,0x00,0x00))

# Configure RDS licensing mode
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\RCM\Licensing Core" -Name "LicensingMode" -Value 4
Tool Purpose Command
PerfView CPU contention PerfView /nogui collect
RAMMap Memory usage N/A (GUI tool)
LatencyMon DPC latency N/A (GUI tool)
PAL Perfmon analysis PAL.exe counterfile.xml

These combinations typically indicate specific bottlenecks:

High CPU + Low Disk Queue → CPU bottleneck
High Disk Queue + Low CPU → Storage bottleneck
Low Network Utilization + High Latency → Network config issue
Memory Pressure + High Hard Faults → RAM limitation

When users report lag or delay in a Windows Server 2008 R2 Remote Desktop Services environment, the symptoms typically manifest as:

- Input latency (keystrokes/mouse movements delayed)
- Screen refresh artifacts
- Intermittent connection drops
- Audio/video synchronization issues

From my experience troubleshooting RDS deployments, these are the critical components to examine:

Network Throughput Analysis

Run continuous ping tests during peak usage:

ping -t rds.yourdomain.com > rds_pinglog.txt

Check for packet loss or latency spikes in the output.

Server Resource Monitoring

Use PowerShell to capture performance counters:

Get-Counter '\Processor(_Total)\% Processor Time' -Continuous |
Export-Counter -Path .\CPU_Usage.blg -FileFormat BLG

Session-Specific Diagnostics

Query active sessions with:

query session /server:localhost

Then examine specific session details:

query process /server:localhost /id:<sessionID>

Several registry tweaks can improve RDS 2008 R2 performance:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations]
"MaxMonitors"=dword:00000004
"MaxXResolution"=dword:00000800
"MaxYResolution"=dword:00000600
"fEnableWinstation"=dword:00000001

For VMware environments, these vSphere settings are critical:

- Reserve 100% memory for the RDS VM
- Enable CPU hot-add if available
- Configure network adapters as VMXNET3
- Disable memory balloon driver during peak hours

Consider using these specialized tools:

- Microsoft's RDP Performance Analyzer
- PerfView for .NET application analysis
- WireShark for RDP protocol inspection
- LatencyMon for DPC latency checks

When remote users experience graphical lag, check GPU usage with:

typeperf "\GPU Engine(*)\Utilization Percentage" -si 5 -o gpu_log.csv

Process the CSV with this PowerShell script:

$data = Import-Csv .\gpu_log.csv
$data | Where-Object { $_."\\SERVER\GPU Engine(*)\Utilization Percentage" -gt 80 } |
Export-Csv .\high_gpu.csv -NoTypeInformation