Windows Server

Windows Server 2019/2022’de RDS Performans Sorunları

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 Rule Count
Windows Firewall Rule

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;

RDS Session Limits – Cengiz YILMAZ

Cengiz YILMAZ

5 Yıldır IT Sektörü içerisindeyim, Microsoft ürünleri ile ilgilenmekteyim. Cengiz YILMAZ | MCT |

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu