Hulpartikel overzicht

Hulpartikel

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, 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?

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).

windows start powershell run as admin


 

Stap 2

Voer de onderstaande commando's uit:

Powercfg -setacvalueindex scheme_current sub_processor PROCTHROTTLEMIN 100Powercfg -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 weggeparkeerd in een energiebesparende stand.
     
  • Powercfg -setactive scheme_current:
    Verwerkt 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 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 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.

Stap 1

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

windows start powershell run as admin


 

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.

windows start regedit


 

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'.

regedit firewallpolicy new dword


 

Stap 5

Verander de naam van de nieuwe registry key naar 'DeleteUserAppContainersOnLogoff', dubbelklik er op en verander de waarde naar 1.

regedit firewallpolicy new dword

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.

powershell firewall rules to remove


 

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.

Wil je dit artikel met andere gebruikers bespreken? Laat dan vooral een bericht achter onder 'Reacties'.

Probeer BladeVPS een maand gratis

Maak van jouw volgende website of applicatie een succes op BladeVPS PureSSD. Probeer direct of een self-managed VPS iets voor jou is; de eerste maand krijg je van ons :-)!

Start nu je gratis maand

Heb je ook een goed idee?

Stuur jouw idee in! Met genoeg stemmen komt jouw idee op onze wishlist!

Heeft dit artikel je geholpen?

Maak een account aan of log in om een beoordeling achter te laten.

Reacties

Maak een account aan of log in om een reactie te plaatsen.

Kom je er niet uit?

Ontvang persoonlijke hulp van onze supporters

Neem contact op