Günümüzde kuruluşların ihtiyaçlarına göre RDS (Remote Desktop Services) ortamları kurulabilmektedir.
Bu yazımızda RDS/RDS Farm ortamlarında performans sorunları için çözüm önerilerinden bahsedeceğim. Bu çözümleri uygulamadan önce kendi ortamlarınızı iyi analiz yapmanız gerekiyor ve sorunların detayına inmeniz gerekiyor.
User Profile Disk Kullanılan Ortam İçin Performans Sorunu ve Çözümü
RDS Farm ortamları çok sayıda kullanıcıların bağlanabilmesi için oluşturulmuş mimarilere dayanmaktadır. Bu tarz ortamlarda User Profile Disk (UPD) kullanılıyorsa bazı performans sorunları ile karşılaşabilirsiniz.
Bizim Performans sorunu olarak tanımladığımız yapı aslında Windows için olağan bir şey. Session Host sunucusuna bağlanan her kullanıcı için Windows Firewall üzerinde Inbound ve Outbound Rule oluşturmaktadır.
Oluşan kurallar silinmediği için bir süre sonra sistem üzerinde Performans sorunları ortaya çıkaracaktır. Özellikle RDP sırasında Görev Çubuğu, siyah ekran gibi sorunlar ile karşılaşabilirsiniz. Inbound ve Outbound Rule aşağıdaki gibi gözükmektedir.


Windows Firewall içerisinde kaç tane Rule olduğunu görmek için aşağıdaki komut satırını kullanabilirsiniz;
(Get-NetFirewallRule).count
Kullanıcılarınız oturum açma işleminden sonra Windows Firewall üzerinde UWP için kurallar oluşturulur ve zamanla sunucu üzerinde yavaşlıklar yaşanmaya başlar.
Bu sorunun çözümü için Regedit üzerinde aşağıdaki anahtarı oluşturabilirsiniz ve ilgili kuralların LogOff sonrasında otomatik silinmesini sağlayabilirsiniz.
- Reg key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy
- Type: REG_DWORD
- Property: DeleteUserAppContainersOnLogoff
- Value:
1
PowerShell ile eklemek isterseniz kullanılması gereken satır;
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy" -Type DWord -Name DeleteUserAppContainersOnLogoff -Value 1
Oluşturulan kuralları el ile temizleyebilirsiniz yada aşağıdaki Technet üzerinde paylaşılmış olan PowerShell Scripti kullanabilirsiniz;
$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}
$FWConfigurableRules = Get-NetFirewallRule -policystore configurableservicestore |Where {$_.Owner -ne $Null} | sort Displayname, Owner $FWConfigurableRulesUnique = Get-NetFirewallRule -policystore configurableservicestore |Where {$_.Owner -ne $Null} | sort Displayname, Owner -Unique Write-Host "# service configurable rules : " $FWConfigurableRules.Count Write-Host "# service configurable rules (Unique): " $FWConfigurableRulesUnique.Count if ($FWConfigurableRules.Count -ne $FWOutboundRulesUnique.Count) { Write-Host "# rules to remove : " (Compare-Object -referenceObject $FWConfigurableRules -differenceObject $FWConfigurableRulesUnique).Count Compare-Object -referenceObject $FWConfigurableRules -differenceObject $FWConfigurableRulesUnique | select -ExpandProperty inputobject |Remove-NetFirewallRule}
RDS’te Disconnect olan kullanıcıları SignOff yapma için aşağıdaki makaleyi takip edebilirsiniz;