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, zoals ons VPS-platform.
In dit artikel laten we twee van de meest voorkomende oorzaken zien en leggen uit hoe je die oplost.
We gaan kijken of we de performance tips in dit artikel automatisch kunnen verwerken in nieuwe Windows Server installaties. Indien dit mogelijk is zullen we in dit artikel aangeven per wanneer dit wordt toegepast.
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 ander hardware component). Het doel van deze functionaliteit is om zo veel 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. Meer informatie over overige beschikbare opties vind je in de documentatie van Microsoft.
Hoe pas je deze opties aan?
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
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 een 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.
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's uit:
reg delete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\RestrictedServices\Configurable\System" /va /f
Stap 3
Sluit PowerShell 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.
Sluit tot slot de Registry Editor.
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 in een reactie onder dit artikel.
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 onze supportafdeling te benaderen. Je kunt hen bereiken via de knop 'Neem contact op' onderaan deze pagina.