RDS performance-problemen oplossen

RDS performance-problemen oplossen

RDS performance-problemen oplossen

Performance problemen met Remote Desktop (RDS) servers komen vaak voor, met name bij grotere RDS-servers. Dit is voor een groot deel het gevolg van instellingen binnen Windows Server die Microsoft automatisch levert, maar lang niet altijd geoptimaliseerd zijn voor virtuele machines.
In dit artikel laten we twee van de meest voorkomende oorzaken zien en leggen we uit hoe je die kan oplossen.

Windows Power Settings
De eerste grote boosdoener, zijn de stroominstellingen in Windows Server. De specifieke instellingen waar het hier om gaat zijn niet terug te zien wanneer je via Windows-start > Edit Power Plan de instellingen aanpast. Het gaat hier specifiek om twee opties:

TL;DR: Windows Server probeert waar mogelijk energie te besparen door de CPU-clockfrequentie en het CPU-voltage te verlagen. Daarnaast worden waar mogelijk cores in slaapstand geplaatst.
Ga naar stap 1 om deze opties uit te schakelen.

Voltage en CPU-frequentie van de CPU aanpassen
Processors schakelen tussen performance states (P-states). Deze P-states beheren het voltage en de CPU-frequentie van de CPU. Als je Windows-Server inschat dat er performance bespaart kan worden, zorgt deze optie er voor dat er minder stroom naar de processor gaat en de clockfrequentie omlaag wordt geschaald.
Voor de laagst mogelijke latency, maximale CPU-frequentie en simpelweg de hoogste performance, kun je je Windows-Server instellen met een 100% minimum processor performance. Het voltage en de CPU-frequentie van je processor worden dan niet meer naar beneden aangepast.

Dynamisch aanpassen van beschikbare CPU cores (core parking)
De processor power management (PPM) engine en de Windows scheduler passen samen dynamisch het aantal cores aan dat beschikbaar is om processen uit te voeren. In de praktijk kan dit ertoe leiden dat (doorgaans tijdelijk) je Windows Server bijvoorbeeld inschat dat 2 van de cores genoeg zijn. Heeft je VPS er 8, dan worden de andere 6 ‘geparkeerd’.
Cores die geparkeerd worden, krijgen geen processen toegewezen en droppen in een zeer lage stroom state wanneer ze geen andere taken zoals interrupts verwerken (interrupts zijn verzoeken van een hardware component aan een andere hardware component). Het doel van deze functionaliteit is om zoveel mogelijk stroom te besparen.
Voor maximale performance van je server kun je simpelweg deze functionaliteit uitzetten.

Overige opties
Er zijn meer finetuning opties beschikbaar wanneer je tussen besparing en performance wil balanceren. We laten in dit artikel enkel zien wat nodig is om voor 100% CPU-performance te kiezen.

Hoe pas je deze opties aan?

Stap 1
De hierboven besproken opties beheer je via Powershell.
Verbind via Remote Desktop met je Windows Server en start Powershell als administrator (Start > Powershell > Rechter muisknop > Uitvoeren als administrator).

 

Stap 2
Voer de onderstaande commando’s uit:

Powercfg -setacvalueindex scheme_current sub_processor PROCTHROTTLEMIN 100
Powercfg -setacvalueindex scheme_current sub_processor CPMINCORES 100
Powercfg -setactive scheme_current

Toelichting
Powercfg -setacvalueindex scheme_current sub_processor PROCTHROTTLEMIN 100:
Deze optie zorgt ervoor dat de processor performance op minimaal 100% staat. Er wordt dan geen verlaging van de CPU-clockfrequentie of CPU-voltage meer toegepast.
Powercfg -setacvalueindex scheme_current sub_processor CPMINCORES 100:
Alle cores blijven paraat en worden niet meer weg geparkeerd in een energiebesparende stand.
Powercfg -setactive scheme_current:
Verwerk de bovenstaande wijzigingen. Er is geen herstart van je VPS nodig.

Wil je zien welke opties allemaal op je huidige powerplan worden toegepast? Gebruik dan het commando:

powercfg /query scheme_current

Let wel op dat niet alle waardes overeenkomen met percentages. 0x00000000 – 0x00000064 is een bereik van 0-100%
That’s it! Je CPU is nu geconfigureerd voor 100% performance. Dat brengt ons bij de volgende bottleneck:

Windows Firewall

TL;DR: Windows Firewall maakt voor iedere nieuwe RDS-verbinding dezelfde 11 firewall regels aan. De regels worden niet verwijdert maar wel elke keer ingeladen, waardoor inloggen via RDS steeds trager wordt.
Ga naar stap 1 om automatisch de regels te laten verwijderen na het verbreken van een RDS-sessie.

Wanneer je via Remote Desktop met je Windows Server verbindt, maakt Windows Firewall 11 regels aan voor die specifieke gebruiker. Die regels worden echter niet verwijdert wanneer je je RDS-verbinding verbreekt. Het gevolg hiervan is dat telkens dezelfde regels opnieuw worden aangemaakt, terwijl die eigenlijk al bestaan.

Op servers met meerdere RDS-gebruikers kan dit ervoor zorgen dat je op een gegeven moment duizenden, zo niet tienduizenden firewall regels hebt, die compleet overbodig zijn, maar wel worden ingeladen wanneer je verbindt via RDS. Je ziet dit terug doordat na het inloggen via RDS je enige tijd een zwart scherm te zien krijgt.

De oplossing hiervoor is om bestaande regels die op deze manier zijn aangemaakt te verwijderen, de betreffende registry keys op te schonen en een patch van Microsoft via het register in te schakelen.

Voor Windows Server 2016 moet update KB4467684 geïnstalleerd zijn en voor Windows Server 2019 update KB4490481. Deze zijn automatisch geïnstalleerd als alle recente Windows updates op je server zijn geïnstalleerd.

Stap 1
Verbind via Remote Desktop met je Windows Server en start Powershell als administrator (Start > Powershell > Rechter muisknop > Uitvoeren als administrator).

Stap 2
Voer het volgende commando uit:

reg delete “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\RestrictedServices\Configurable\System” /va /f

 

Stap 3
Sluit Power Shell niet af, maar druk op de Windows Start-knop, zoek op ‘Regedit’ en klik op ‘Registry Editor’ in de resultaten.

Stap 4
Kopieer en plak in het zoekveld bovenaan de waarde
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy’,
Klik met de rechter muisknop op een lege plek aan de rechterkant en selecteer ‘New’ > ‘DWORD (32 bit) Value’.

Stap 5
Verander de naam van de nieuwe registry key naar ‘DeleteUserAppContainersOnLogoff’, dubbelklik er op en verander de waarde naar 1.

Stap 6
Keer terug naar PowerShell en kopieer en plak daar de onderstaande code in (let op de scrollbalk). Deze zullen over meerdere regels worden uitgevoerd en voor de laatste regel moet je nog een keer op ‘Enter’ drukken.

$FWInboundRules = Get-NetFirewallRule -Direction Inbound |Where {$_.Owner -ne $Null} | sort Displayname, Owner
$FWInboundRulesUnique = Get-NetFirewallRule -Direction Inbound |Where {$_.Owner -ne $Null} | sort Displayname, Owner -Unique
Write-Host “# inbound rules : ” $FWInboundRules.Count
Write-Host “# inbound rules (Unique): ” $FWInboundRulesUnique.Count
if ($FWInboundRules.Count -ne $FWInboundRulesUnique.Count) {
Write-Host “# rules to remove : ” (Compare-Object -referenceObject $FWInboundRules -differenceObject $FWInboundRulesUnique).Count
Compare-Object -referenceObject $FWInboundRules -differenceObject $FWInboundRulesUnique | select -ExpandProperty inputobject |Remove-NetFirewallRule }

$FWOutboundRules = Get-NetFirewallRule -Direction Outbound |Where {$_.Owner -ne $Null} | sort Displayname, Owner
$FWOutboundRulesUnique = Get-NetFirewallRule -Direction Outbound |Where {$_.Owner -ne $Null} | sort Displayname, Owner -Unique
Write-Host “# outbound rules : : ” $FWOutboundRules.Count
Write-Host “# outbound rules (Unique): ” $FWOutboundRulesUnique.Count
if ($FWOutboundRules.Count -ne $FWOutboundRulesUnique.Count) {
Write-Host “# rules to remove : ” (Compare-Object -referenceObject $FWOutboundRules -differenceObject $FWOutboundRulesUnique).Count
Compare-Object -referenceObject $FWOutboundRules -differenceObject $FWOutboundRulesUnique | select -ExpandProperty inputobject |Remove-NetFirewallRule}

 

PS: Let in de output vooral ook op het aantal verwijderde regels. Op deze testserver is dit een klein aantal. Zie je hier een absurd hoog getal terug en merk je een verschil? We horen het graag van je!

Stap 7
Reboot tot slot je VPS en geniet van je verbeterde RDS-performance!

Daarmee zijn we aan het eind gekomen van deze handleiding voor het verbeteren van de performance van Remote Desktop binnen Windows Server.
Mocht je aan de hand van dit artikel nog vragen hebben, aarzel dan niet om ons te bellen/mailen/appen. Alle gegevens om ons te bereiken vind je onderaan deze pagina.