IIS Application Pool RAM Management

'Black Warrior

Yaşayan Forum Efsanesi
8 Ocak 2013
12,132
5
E5
Öncelikle IIS açarak ram miktarını tanımlayalım.


Sağ tarafta bulunan Set Application Pool Defaults tıklıyoruz ve açılacak sayfada REcycling altındaki Private Memory Limit seçeneğine gelerek buraya vereceğimiz ram limitini KB cinsinden giriyoruz.

İşlemi tamamladıktan sonra OK tıklayacak pencereyi kapatıyoruz.

Artık tüm uygulama havuzlarında girmiş olduğunuz limitleme tanımlanmış durumda.

Yalnız dikkat etmeniz gereken bir nokta var. Ram limiti tanımladıktan sonra Ram limitini aşan uygulama havuzları otomatikman recycling olacak ve sunucuda darboğaz oluşmasını engelleyeceğiz ancak uygulama havuzunun recycle olması demek mevcut sessionların sonlanması demektir. Bu sebeple uygulama havuzu her recycle olduğunda sessionlar sonlanacak ve yeni sessionlar açılacaktır. Bu sebeple session sonlanma problemini göz önüne alarak bazı uygulama havuzlarında bu limitlemenin oluşmamasını isteyebilirsiniz. Örneğin; bir paneliniz var ve panel uygulama havuzunun recycle olmasını istemiyorsunuz o zaman bu uygulama havuzunu bu kuralın dışına çıkarmanız lazım. Bu şekilde birden fazla uygulama havuzunuz var ise oturup tek tek uygulama havuzunu açıp advanced settings girip bu limiti 0 yapmak ile uğraşmamanız adına aşağıdaki powershell scriptini kendinize göre düzenleyip kullanabilirsiniz.

Import-Module WebAdministration
Set-ItemProperty -Path "IIS:\AppPools\DefaultAppPool" -Name Recycling.periodicRestart.privateMemory -Value 0
Set-ItemProperty -Path "IIS:\AppPools\ASP.NET 2.0 (Classic)" -Name Recycling.periodicRestart.privateMemory -Value 0
Set-ItemProperty -Path "IIS:\AppPools\WebsitePanel Portal Pool" -Name Recycling.periodicRestart.privateMemory -Value 0
Set-ItemProperty -Path "IIS:\AppPools\WebsitePanel Server Pool" -Name Recycling.periodicRestart.privateMemory -Value 0
Limit tanımlama işlemini yaptıktan sonra şimdi sıra geldi limit aşımı yapan uygulama havuzlarının bildirimini almaya. Yapınızda bir SCCM yok ise bu işi event viewer ve zamanlanmış görev yardımı ile yapacağız.

Aşağıdaki kodları bir xml içerisine kayıt ediyoruz. Ben XML dosyasına IIS-Limit.xml ismini verdim.

Kod:
<ViewerConfig><QueryConfig><QueryParams><UserQuery   /></QueryParams><QueryNode><Name>IIS-Limit</Name><QueryList><Query  Id="0" Path="System"><Select Path="System"> [/FONT][/B][/COLOR]
[COLOR=Green][B][FONT=Comic Sans MS]        *[System[(EventID=5117) or  (EventID=5077)]][/FONT][/B][/COLOR][/CENTER]
[COLOR=Green][B][FONT=Comic Sans MS] [/FONT][/B][/COLOR][CENTER][COLOR=Green][B][FONT=Comic Sans MS]      </Select></Query></QueryList></QueryNode></QueryConfig><ResultsConfig><Columns><Column  Name="Level" Type="System.String" Path="Event/System/Level"  Visible="">189</Column><Column Name="Keywords"  Type="System.String"  Path="Event/System/Keywords">70</Column><Column Name="Date  and Time" Type="System.DateTime"  Path="Event/System/TimeCreated/@SystemTime"  Visible="">239</Column><Column Name="Source"  Type="System.String" Path="Event/System/Provider/@Name"  Visible="">149</Column><Column Name="Event ID"  Type="System.UInt32" Path="Event/System/EventID"  Visible="">149</Column><Column Name="Task Category"  Type="System.String" Path="Event/System/Task"  Visible="">152</Column><Column Name="User"  Type="System.String"  Path="Event/System/Security/@UserID">50</Column><Column  Name="Operational Code" Type="System.String"  Path="Event/System/Opcode">110</Column><Column Name="Log"  Type="System.String"  Path="Event/System/Channel">80</Column><Column  Name="Computer" Type="System.String"  Path="Event/System/Computer">170</Column><Column  Name="Process ID" Type="System.UInt32"  Path="Event/System/Execution/@ProcessID">70</Column><Column  Name="Thread ID" Type="System.UInt32"  Path="Event/System/Execution/@ThreadID">70</Column><Column  Name="Processor ID" Type="System.UInt32"  Path="Event/System/Execution/@ProcessorID">90</Column><Column  Name="Session ID" Type="System.UInt32"  Path="Event/System/Execution/@SessionID">70</Column><Column  Name="Kernel Time" Type="System.UInt32"  Path="Event/System/Execution/@KernelTime">80</Column><Column  Name="User Time" Type="System.UInt32"  Path="Event/System/Execution/@UserTime">70</Column><Column  Name="Processor Time" Type="System.UInt32"  Path="Event/System/Execution/@ProcessorTime">100</Column><Column  Name="Correlation Id" Type="System.Guid"  Path="Event/System/Correlation/@ActivityID">85</Column><Column  Name="Relative Correlation Id" Type="System.Guid"  Path="Event/System/Correlation/@RelatedActivityID">140</Column><Column  Name="Event Source Name" Type="System.String"  Path="Event/System/Provider/@EventSourceName">140</Column></Columns></ResultsConfig></ViewerConfig>  [/FONT][/B][/COLOR]
[COLOR=Green][B][FONT=Comic Sans MS]

Xml kayıt ettikten sonra bu dosyayı Event Viewer içerisine Custom views olarak ekleyeceğiz. Event Vieweri açıyoruz ve import Custom View seçeneğine tıklıyoruz. IIS-Limit.xml dosyasını gösterip open tıklıyoruz. Karşımıza gelece menüde bir işlem yapmayıp Ok tıklayarak devam ediyoruz.

Custom views altında IIS-Limit event logları geliyor. Limit aşımı yapan kullanıcıları bu şekilde rahatlıkla takip edebilirsiniz.

Şimdi bu logları event loga düştükçe mail olarak bize gönderelim ki hangi uygulama havuzunun ne kadar kaynak tükettiğini görebilelim.

Aşağıda ki powershell dosyasını kendimize göre düzenleyip kayıt ediyoruz.
Kod:
$SMTPServer = "smtp-server-adresiniz" [/FONT][/B][/COLOR]
[COLOR=Green][B][FONT=Comic Sans MS]$SMTPPort = "25"[/FONT][/B][/COLOR][/CENTER]
[COLOR=Green][B][FONT=Comic Sans MS] [/FONT][/B][/COLOR][CENTER][COLOR=Green][B][FONT=Comic Sans MS]$Username = "mail-hesabınız"[/FONT][/B][/COLOR][/CENTER]
[COLOR=Green][B][FONT=Comic Sans MS] [/FONT][/B][/COLOR][CENTER][COLOR=Green][B][FONT=Comic Sans MS]$Password = "Şifreniz"[/FONT][/B][/COLOR][/CENTER]
[COLOR=Green][B][FONT=Comic Sans MS] [/FONT][/B][/COLOR][CENTER][COLOR=Green][B][FONT=Comic Sans MS] [/FONT][/B][/COLOR][/CENTER]
[COLOR=Green][B][FONT=Comic Sans MS] [/FONT][/B][/COLOR][CENTER][COLOR=Green][B][FONT=Comic Sans MS]$to = "[email protected]"[/FONT][/B][/COLOR][/CENTER]
[COLOR=Green][B][FONT=Comic Sans MS] [/FONT][/B][/COLOR][CENTER][COLOR=Green][B][FONT=Comic Sans MS]#$cc = "[email protected]"[/FONT][/B][/COLOR][/CENTER]
[COLOR=Green][B][FONT=Comic Sans MS] [/FONT][/B][/COLOR][CENTER][COLOR=Green][B][FONT=Comic Sans MS]$subject = "Website Kaynak Yetersizligi"[/FONT][/B][/COLOR][/CENTER]
[COLOR=Green][B][FONT=Comic Sans MS] [/FONT][/B][/COLOR][CENTER][COLOR=Green][B][FONT=Comic Sans MS]$body = get-winevent -FilterHashtable @{Logname='System';ID=5117}  -MaxEvents 1| select message, TimeCreated | format-list | Out-String [/FONT][/B][/COLOR][/CENTER]
[COLOR=Green][B][FONT=Comic Sans MS] [/FONT][/B][/COLOR][CENTER][COLOR=Green][B][FONT=Comic Sans MS]$message = New-Object System.Net.Mail.MailMessage[/FONT][/B][/COLOR][/CENTER]
[COLOR=Green][B][FONT=Comic Sans MS] [/FONT][/B][/COLOR][CENTER][COLOR=Green][B][FONT=Comic Sans MS]$message.subject = $subject[/FONT][/B][/COLOR][/CENTER]
[COLOR=Green][B][FONT=Comic Sans MS] [/FONT][/B][/COLOR][CENTER][COLOR=Green][B][FONT=Comic Sans MS]$message.body = $body[/FONT][/B][/COLOR][/CENTER]
[COLOR=Green][B][FONT=Comic Sans MS] [/FONT][/B][/COLOR][CENTER][COLOR=Green][B][FONT=Comic Sans MS]$message.to.add($to)[/FONT][/B][/COLOR][/CENTER]
[COLOR=Green][B][FONT=Comic Sans MS] [/FONT][/B][/COLOR][CENTER][COLOR=Green][B][FONT=Comic Sans MS]#$message.cc.add($cc)[/FONT][/B][/COLOR][/CENTER]
[COLOR=Green][B][FONT=Comic Sans MS] [/FONT][/B][/COLOR][CENTER][COLOR=Green][B][FONT=Comic Sans MS]$message.from = $username[/FONT][/B][/COLOR][/CENTER]
[COLOR=Green][B][FONT=Comic Sans MS] [/FONT][/B][/COLOR][CENTER][COLOR=Green][B][FONT=Comic Sans MS] [/FONT][/B][/COLOR][/CENTER]
[COLOR=Green][B][FONT=Comic Sans MS] [/FONT][/B][/COLOR][CENTER][COLOR=Green][B][FONT=Comic Sans MS]$smtp = New-Object System.Net.Mail.SmtpClient($SMTPServer, $SMTPPort);[/FONT][/B][/COLOR][/CENTER]
[COLOR=Green][B][FONT=Comic Sans MS] [/FONT][/B][/COLOR][CENTER][COLOR=Green][B][FONT=Comic Sans MS]$smtp.EnableSSL = $false[/FONT][/B][/COLOR][/CENTER]
[COLOR=Green][B][FONT=Comic Sans MS] [/FONT][/B][/COLOR][CENTER][COLOR=Green][B][FONT=Comic Sans MS]$smtp.Credentials = New-Object System.Net.NetworkCredential($Username, $Password);[/FONT][/B][/COLOR][/CENTER]
[COLOR=Green][B][FONT=Comic Sans MS] [/FONT][/B][/COLOR][CENTER][COLOR=Green][B][FONT=Comic Sans MS][System.Net.ServicePointManager]::ServerCertificateValidationCallback = { return $true }[/FONT][/B][/COLOR][/CENTER]
[COLOR=Green][B][FONT=Comic Sans MS] [/FONT][/B][/COLOR][CENTER][COLOR=Green][B][FONT=Comic Sans MS]$smtp.send($message)[/FONT][/B][/COLOR][/CENTER]
[COLOR=Green][B][FONT=Comic Sans MS] [/FONT][/B][/COLOR][CENTER][COLOR=Green][B][FONT=Comic Sans MS]write-host "Mail Sent" [/FONT][/B][/COLOR]
[COLOR=Green][B][FONT=Comic Sans MS]


bu dosyayı kendinize göre düzenleyip IIS-Limit-Sendmail.ps1 ismi ile kayıt edin ve Event loglarda IIS-Limit sağ tıklayıp Attach task to This Custom View tıklayın açılacak pencerede Next diyerek devam edin.


Burada Start a Program diyerek devam ediyoruz.

Program/Script bölümüne powershell yazıyoruz. Add Arguments bölümüne ise aşağıda ki yazıyı kendinize göre düzenleyip yazıyoruz.

-file "C:\Program Files\IIS-Limit\IIS-Limit-Sendmail.ps1"

Ben IIS-Limit-Sendmail dosyasını Program files altında bir dizine attığım için bu yolu yazdım. Kendinize göre düzenleyebilirsiniz.

Yazdıktan sonra Next ve fnish diyerek işlemi tamamlıyoruz.

Artık Event loga her düşecek olan 5117 Id’li yani ram limiti aşan uygulama havuzu logu için size mail gelecektir.

Bu şekilde web sunucu üzerindeki uygulama havuzlarının kullanacağı kaynakları limitlendirip takip ederek sunucu optimizasyonunu bir adım ileri taşımış oluyoruz.


 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.