Windows Reliability Monitor ile Kararlılık Analizi

Bir Salı sabahı, üretim sunucunuzda beklenmedik bir uygulama çökmesi yaşandı. Olay günlükleri binlerce satır log ile dolu, Event Viewer’da ne arayacağınızı bilmiyorsunuz ve yöneticiniz “ne zaman düzelecek?” diye soruyor. İşte tam bu noktada Reliability Monitor devreye giriyor. Çoğu Windows yöneticisinin varlığından haberdar olduğu ama aktif olarak kullanmadığı bu araç, aslında sistem kararlılığını analiz etmede ciddi bir zaman tasarrufu sağlıyor.

Reliability Monitor Nedir ve Neden Önemlidir

Windows Reliability Monitor (Güvenilirlik İzleyicisi), Windows Vista ile hayatımıza girdi ve o günden bu yana her Windows sürümünde varlığını sürdürüyor. Arka planda çalışan RacTask zamanlanmış görevi sayesinde sistem olaylarını sürekli toplar ve bunları görsel bir zaman çizelgesi üzerinde sunar.

Peki Event Viewer varken neden Reliability Monitor kullanalım? İki araç birbirini tamamlar, birbirinin yerine geçmez. Event Viewer ham log verisi sunar; Reliability Monitor ise bu veriyi zaman ekseninde korelasyonlu bir şekilde gösterir. Bir uygulamanın üç haftadır her Pazartesi sabahı çöktüğünü Event Viewer ile bulmak saatler alabilir. Reliability Monitor’de bu pattern grafikte hemen göze çarpar.

Stability Index, 1 ile 10 arasında değişen bir puanlama sistemidir. Herhangi bir sorun yaşanmayan günlerde bu puan yavaş yavaş 10’a yaklaşır, her hata olay puanı belirli miktarda düşürür. Bu yapı, “sistem ne zaman istikrara kavuştu?” sorusunu yanıtlamada son derece kullanışlıdır.

Reliability Monitor’e Erişim Yöntemleri

Grafik Arayüz ile Erişim

En basit yöntem, Çalıştır penceresine (Win+R) aşağıdaki komutu yazmaktır:

perfmon /rel

Alternatif olarak Control Panel üzerinden de ulaşabilirsiniz:

control panel -> System and Security -> Security and Maintenance -> Reliability History

Sunucularda bazen Control Panel kısıtlanmış olabilir. Bu durumda doğrudan çalıştırılabilir dosyayı kullanın:

%SystemRoot%System32perfmon.exe /rel

PowerShell ile Reliability Verilerine Erişim

Grafik arayüz güzel, ama 50 sunucuyu tek tek açıp bakmak pratik değil. Gerçek hayatta bu verilere PowerShell üzerinden erişmek çok daha verimli:

Get-WinEvent -ProviderName "Microsoft-Windows-Reliability-Analysis-WMI" -MaxEvents 50 | 
Select-Object TimeCreated, Id, Message | 
Format-Table -AutoSize

WMI üzerinden daha detaylı veri çekmek için:

$reliability = Get-CimInstance -ClassName Win32_ReliabilityStabilityMetrics | 
    Select-Object SystemStabilityIndex, TimeGenerated |
    Sort-Object TimeGenerated -Descending

$reliability | Format-Table TimeGenerated, SystemStabilityIndex -AutoSize

Bu komut size son 28 günlük stability index değerlerini tarihe göre sıralı olarak getirir. Bir değişiklik yapılmadan önceki ve sonraki stability puanlarını karşılaştırmak için mükemmeldir.

Reliability Records WMI Sorgusu

Sadece puanlar değil, olayların kendisine de WMI üzerinden erişebilirsiniz:

$records = Get-CimInstance -ClassName Win32_ReliabilityRecords |
    Where-Object { $_.SourceName -ne "Microsoft-Windows-WindowsUpdateClient" } |
    Select-Object TimeGenerated, SourceName, ProductName, Description |
    Sort-Object TimeGenerated -Descending |
    Select-Object -First 20

$records | Format-List

Burada Windows Update kayıtlarını filtreledim, çünkü aktif bir sistemde bunlar listenin büyük bölümünü dolduruyor ve gerçek problemleri gizliyor.

Reliability Monitor’deki Olay Kategorileri

Reliability Monitor beş temel kategoriyi takip eder:

  • Application Failures: Uygulama çökmeleri ve yanıt vermeme durumları. Bu kategorideki olaylar stability index’i en çok düşüren olaylardır.
  • Windows Failures: BSOD, boot hataları ve işletim sistemi bileşenlerindeki sorunlar. Görünce ciddiye almanız gereken kategoridir.
  • Miscellaneous Failures: Driver hataları, disk hataları ve diğer donanım kaynaklı sorunlar.
  • Warnings: Yüklenemeyen driver’lar ve uyarı niteliğindeki olaylar. Stability index’i düşürmez ama dikkat edilmesi gerekir.
  • Information: Başarılı Windows Update kurulumları, uygulama yüklemeleri. Zaman çizelgesinde ne zaman ne kurulduğunu görmek için kritik öneme sahip.

Gerçek Dünya Senaryosu: Gece Yarısı Uygulama Çökmeleri

Geçen yıl bir müşterimde şu durumla karşılaştım: ERP uygulaması her gece 02:30 civarında çakılıyordu. Sabahları işe gelen kullanıcılar uygulamayı ayağa kaldırmak zorunda kalıyordu. Event Viewer’da bakmayı denedim, Application log’u binlerce kayıtla doluydu.

Reliability Monitor’i açtım ve pattern hemen göründü. Her gece aynı saatte kırmızı X işareti. Üstelik tam o saatte bir de sarı uyarı vardı: scheduled backup task başarısız oluyor ve disk I/O spike yapıyordu. ERP uygulaması bu I/O yükünü kaldıramayıp timeout alıyordu.

Bu analizi Event Viewer ile yapmak için şunu çalıştırmam gerekirdi:

$startTime = (Get-Date).AddDays(-14)
$endTime = Get-Date

$events = Get-WinEvent -FilterHashtable @{
    LogName = 'Application'
    Level = 1,2
    StartTime = $startTime
    EndTime = $endTime
} | Where-Object { $_.TimeCreated.Hour -ge 2 -and $_.TimeCreated.Hour -le 3 }

$events | Group-Object -Property { $_.TimeCreated.Date } | 
    Select-Object Name, Count | 
    Sort-Object Name

Reliability Monitor bu sonuca görsel olarak iki dakikada ulaştırdı.

Stability Index Hesaplamasını Anlamak

Microsoft’un stability index algoritması tam olarak belgelenmemiş, ancak genel prensiplerini bilmek analizi kolaylaştırıyor:

Sistem sorunsuz çalışmaya devam ettikçe puan günde yaklaşık 0.1 artış gösterir. Uygulama çökmesi yaklaşık 0.5-1 puan düşürür. Windows çökmesi (BSOD) 2-3 puan düşürür. Bu değerler sabit değil, son 28 günlük pencere üzerinden hesaplanır, yani eski olayların etkisi zamanla azalır.

PowerShell ile bu trendi takip etmek için şu script’i kullanıyorum:

$metrics = Get-CimInstance -ClassName Win32_ReliabilityStabilityMetrics |
    Sort-Object TimeGenerated

$last7Days = $metrics | Where-Object { 
    $_.TimeGenerated -gt (Get-Date).AddDays(-7) 
}

$avgStability = ($last7Days | Measure-Object -Property SystemStabilityIndex -Average).Average
$minStability = ($last7Days | Measure-Object -Property SystemStabilityIndex -Minimum).Minimum

Write-Host "Son 7 Gun Ortalama Stability: $([math]::Round($avgStability, 2))"
Write-Host "Son 7 Gun Minimum Stability: $([math]::Round($minStability, 2))"

if ($avgStability -lt 7) {
    Write-Warning "Sistem kararliligi dusuk! Detayli inceleme gerekiyor."
}

Bu script’i monitoring sistemine entegre edip alert tanımladığınızda, stability puanı belirli bir eşiğin altına düştüğünde otomatik bildirim alabilirsiniz.

Reliability Monitor Verilerini Uzak Sunuculardan Toplama

Tek sunucuyla çalışırken GUI yeterli, ama onlarca sunucuya baktığınızda otomasyona ihtiyaç duyuyorsunuz. Aşağıdaki script, bir sunucu listesinden güvenilirlik verilerini toplar:

$sunucuListesi = @("SUNUCU01", "SUNUCU02", "SUNUCU03", "DBSUNUCU01")
$rapor = @()

foreach ($sunucu in $sunucuListesi) {
    try {
        $metrics = Get-CimInstance -ClassName Win32_ReliabilityStabilityMetrics `
            -ComputerName $sunucu -ErrorAction Stop |
            Sort-Object TimeGenerated -Descending |
            Select-Object -First 1

        $kritikOlaylar = Get-CimInstance -ClassName Win32_ReliabilityRecords `
            -ComputerName $sunucu -ErrorAction Stop |
            Where-Object { 
                $_.TimeGenerated -gt (Get-Date).AddDays(-7) -and
                $_.RecordType -in @("ApplicationFailure", "WindowsFailure")
            }

        $rapor += [PSCustomObject]@{
            Sunucu          = $sunucu
            StabilityIndex  = [math]::Round($metrics.SystemStabilityIndex, 2)
            SonGuncelleme   = $metrics.TimeGenerated
            KritikOlaySayisi = ($kritikOlaylar | Measure-Object).Count
            Durum           = if ($metrics.SystemStabilityIndex -ge 8) { "IYI" }
                              elseif ($metrics.SystemStabilityIndex -ge 5) { "DIKKAT" }
                              else { "KRITIK" }
        }
    }
    catch {
        $rapor += [PSCustomObject]@{
            Sunucu           = $sunucu
            StabilityIndex   = "ERISIM HATASI"
            SonGuncelleme    = $null
            KritikOlaySayisi = $null
            Durum            = "BILINMIYOR"
        }
    }
}

$rapor | Format-Table -AutoSize
$rapor | Export-Csv -Path "C:RaporlarStabilityRaporu_$(Get-Date -Format 'yyyyMMdd').csv" -Encoding UTF8 -NoTypeInformation

Bu script’i haftalık zamanlanmış görev olarak ayarlayıp CSV çıktısını bir paylaşım klasörüne yazarsanız, basit ama etkili bir izleme altyapısı kurmuş olursunuz.

Reliability Monitor ve Windows Update İlişkisi

Deneyimli sysadmin’lerin iyi bildiği bir durum var: sistemin stability index’i bazen Windows Update sonrasında aniden düşer. Bu her zaman güncellemenin hatalı olduğu anlamına gelmez. Bazen update sonrası restart gerektiren servisler beklenmedik şekilde kapanır, bu da uygulama hataları olarak kaydedilir.

Bu nedenle Reliability Monitor’de Information kategorisindeki Windows Update kayıtlarına dikkat etmek önemlidir. Bir güncelleme ile ardından gelen uygulama hataları arasında zaman korelasyonu varsa, güncelleme iyi bir başlangıç noktasıdır.

Şüpheli bir güncellemeyi tespit ettikten sonra kaldırma seçeneğini değerlendirmeden önce şu sorgula etkisini ölçün:

$updateTarihi = Get-Date "2024-11-15"

$oncesiOlaylar = Get-CimInstance -ClassName Win32_ReliabilityRecords |
    Where-Object { 
        $_.TimeGenerated -lt $updateTarihi -and
        $_.TimeGenerated -gt $updateTarihi.AddDays(-7) -and
        $_.RecordType -eq "ApplicationFailure"
    } | Measure-Object

$sonrasiOlaylar = Get-CimInstance -ClassName Win32_ReliabilityRecords |
    Where-Object { 
        $_.TimeGenerated -ge $updateTarihi -and
        $_.TimeGenerated -lt $updateTarihi.AddDays(7) -and
        $_.RecordType -eq "ApplicationFailure"
    } | Measure-Object

Write-Host "Guncelleme oncesi 7 gun uygulama hatasi: $($oncesiOlaylar.Count)"
Write-Host "Guncelleme sonrasi 7 gun uygulama hatasi: $($sonrasiOlaylar.Count)"

Reliability Data Hizmetini Anlamak

Reliability Monitor verilerini toplayan mekanizma RacTask zamanlanmış görevidir. Bu görev Task Scheduler’da şu konumda bulunur:

Task Scheduler Library -> Microsoft -> Windows -> RAC

RacTask günde bir kez çalışır ve veriyi şu konumlarda saklar:

  • Veritabanı: C:WindowsSystem32sruSRUDB.dat (System Resource Usage veritabanı ile paylaşımlı)
  • XML Raporu: C:WindowsSystem32Reliability (bazı Windows sürümlerinde)

Bir sistemde Reliability Monitor’ün veri göstermediğini fark ederseniz ilk yapmanız gereken RacTask’ın çalışıp çalışmadığını kontrol etmek:

$racTask = Get-ScheduledTask -TaskPath "MicrosoftWindowsRAC" -TaskName "RacTask" -ErrorAction SilentlyContinue

if ($racTask) {
    Write-Host "RacTask durumu: $($racTask.State)"
    Write-Host "Son calisma: $($racTask.LastRunTime)"
    Write-Host "Son sonuc: $($racTask.LastTaskResult)"
    
    if ($racTask.State -ne "Ready") {
        Write-Warning "RacTask beklenmeyen durumda. Yeniden etkinlestiriliyor..."
        Enable-ScheduledTask -TaskPath "MicrosoftWindowsRAC" -TaskName "RacTask"
    }
} else {
    Write-Error "RacTask bulunamadi. Windows gorev zamanlayici duzguncalisiyor mu?"
}

Reliability Monitor’ü Incident Response’a Entegre Etmek

Bir incident açıldığında Reliability Monitor’ü ilk beş dakika içinde kontrol etmek iyi bir alışkanlık. Şu soruları cevaplamanıza yardımcı olur:

  • Problem ne zaman başladı? (Stability index grafiğinin düşmeye başladığı nokta)
  • O tarihte başka ne oldu? (Yazılım kurulumu, Windows update, sürücü değişikliği)
  • Benzer bir şey daha önce oldu mu? (Geçmişteki pattern’lar)
  • Tek bir uygulama mı, sistem geneli mi sorun var?

Incident sonrası raporlama için de Reliability Monitor verisini kullanabilirsiniz. Aşağıdaki script belirli bir tarih aralığındaki tüm olayları HTML raporu olarak çıkarır:

$baslangic = Get-Date "2024-11-01"
$bitis = Get-Date "2024-11-30"

$olaylar = Get-CimInstance -ClassName Win32_ReliabilityRecords |
    Where-Object { 
        $_.TimeGenerated -ge $baslangic -and 
        $_.TimeGenerated -le $bitis
    } |
    Select-Object @{N="Tarih";E={$_.TimeGenerated.ToString("dd.MM.yyyy HH:mm")}},
                  @{N="Tip";E={$_.RecordType}},
                  @{N="Kaynak";E={$_.SourceName}},
                  @{N="Uygulama";E={$_.ProductName}},
                  @{N="Aciklama";E={$_.Description}} |
    Sort-Object Tarih -Descending

$htmlBaslik = @"
<html><head><title>Reliability Raporu</title>
<style>body{font-family:Arial;} table{border-collapse:collapse;width:100%}
th{background:#2c3e50;color:white;padding:8px} td{border:1px solid #ddd;padding:6px}
tr:nth-child(even){background:#f2f2f2}</style></head><body>
<h2>Guvenilirlik Raporu: $($baslangic.ToString('dd.MM.yyyy')) - $($bitis.ToString('dd.MM.yyyy'))</h2>
"@

$olaylar | ConvertTo-Html -Head $htmlBaslik -PreContent "" -PostContent "</body></html>" |
    Out-File "C:RaporlarReliabilityRaporu_Kasim2024.html" -Encoding UTF8

Write-Host "Rapor olusturuldu: C:RaporlarReliabilityRaporu_Kasim2024.html"

Sınırlılıklar ve Dikkat Edilmesi Gerekenler

Reliability Monitor’ün bazı kısıtlamalarını bilmek de en az nasıl kullanılacağını bilmek kadar önemli:

  • 28 günlük pencere: Reliability Monitor yalnızca son 28 günü gösterir. Daha uzun geçmişe bakmak için WMI verileri farklı konumda saklanır ve ayrı sorgu gerektirir.
  • Korelasyon nedensellik değildir: İki olay aynı zamanda gerçekleşti diye biri diğerine neden olmaz. Reliability Monitor hipotez oluşturmada yardımcı olur, kanıtlamada değil.
  • Sunucu Core’da GUI yok: Server Core kurulumlarında Reliability Monitor arayüzü çalışmaz, PowerShell/WMI yöntemlerine başvurmanız gerekir.
  • Zaman dilimi hassasiyeti: WMI üzerinden veri çekerken zaman damgaları UTC olarak gelir. Yerel saat ile karşılaştırma yaparken dönüşüm yapmayı unutmayın.
  • Kısıtlı log derinliği: Çok sık çöken bir sistemde Reliability Monitor yüzeysel bir genel bakış sunar; derinlemesine analiz için Event Viewer ve Process Monitor kaçınılmazdır.

Sonuç

Reliability Monitor, Windows ekosisteminde az kullanılan ama yüksek değer sunan araçların başında gelir. Stability index grafiği sayesinde sistem sağlığını tek bakışta değerlendirmek, zaman korelasyonu ile problem kaynağını hızla daraltmak ve pattern analizi yaparak kronik sorunları tespit etmek mümkün oluyor.

Benim tavsiyem şu: Reliability Monitor’ü problem çıktığında açmak yerine rutin incelemenizin bir parçası haline getirin. Haftada bir kez stability trend’ine bakmak, birçok sorunu kullanıcılar fark etmeden önce yakalamanıza olanak tanır. Yukarıdaki PowerShell script’lerini monitoring altyapınıza entegre ederseniz, bu analizi manuel yapmak zorunda bile kalmazsınız.

Güçlü bir izleme altyapısı, her zaman en gelişmiş araçlardan değil, mevcut araçları doğru ve tutarlı kullanmaktan geçer.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir