Performance Monitor (PerfMon) Kurulumu ve Kullanımı
Yıllar önce bir müşterinin sunucusu gece yarısı çökmüştü. Sabah geldiğimizde event log doluydu ama asıl sorun neydi, kim bilir. O günden sonra “izlemiyorsan yönetemezsin” ilkesini benimsedim ve Windows ortamlarında PerfMon benim en sadık arkadaşım oldu. Bugün bu aracı baştan sona ele alacağız; yüzeysel bir tanıtım değil, gerçekten kullandığım senaryolarla birlikte.
PerfMon Nedir ve Neden Hala Önemlidir
Windows Performance Monitor, işletim sistemiyle birlikte gelen, kurulum gerektirmeyen ve son derece güçlü bir performans izleme aracıdır. “Bunun için Grafana, Prometheus var” diyebilirsiniz, haklısınız da. Ama domain joined bir Windows Server ortamında, özellikle legacy sistemlerin yoğun olduğu enterprise yapılarda PerfMon’un yerini hiçbir şey tutamıyor. Hem agent gerektirmez, hem WMI üzerinden uzak makineleri izleyebilirsiniz, hem de Data Collector Set yapısıyla uzun süreli veri toplayabilirsiniz.
PerfMon’a erişmenin birkaç yolu var:
# Run diyalogdan açmak için
perfmon.msc
# Komut satırından
perfmon /sys
# Resource Monitor için
perfmon /res
Grafik arayüzü genellikle yeterli olsa da asıl güç, komut satırı ve PowerShell entegrasyonunda saklıdır.
Temel Kavramlar: Counter, Object, Instance
PerfMon’u anlamak için üç kavramı netleştirmek gerekiyor.
Performance Object: İzlenecek bileşeni tanımlar. Processor, Memory, LogicalDisk, Network Interface gibi.
Counter: O bileşenin hangi metriğini ölçtüğünüzü belirtir. Processor altında % Processor Time, Interrupts/sec gibi counterlar bulunur.
Instance: Birden fazla aynı nesne varsa hangisini izlediğinizi gösterir. Örneğin 8 çekirdekli bir CPU’da her çekirdek ayrı instance olarak görünür, _Total ise hepsinin toplamıdır.
Bu üçlü yapıyı kafanıza oturttuğunuzda PerfMon’un mantığı anında yerine oturur.
Komut Satırından Counter Listeleme ve Sorgulama
GUI ile her şeyi yapmak zorunda değilsiniz. Typeperf aracı, komut satırından counter değerlerini almanızı sağlar.
# Sistemdeki tüm objeleri listele
typeperf -q | more
# Belirli bir objenin counterlarını listele
typeperf -q "Processor"
# Anlık CPU kullanımını al
typeperf "Processor(_Total)% Processor Time" -sc 1
# Her 5 saniyede bir, 60 örnek al ve CSV'e yaz
typeperf "Processor(_Total)% Processor Time" "MemoryAvailable MBytes" -si 5 -sc 60 -f CSV -o C:Logscpu_memory.csv
typeperf ile hızlı tanı çok kullanışlıdır. Bir sunucuya bağlandığınızda ilk 30 saniyede CPU durumunu görmek istiyorsanız GUI açmak yerine bu komutu çalıştırırsınız.
Data Collector Set Oluşturma
PerfMon’un asıl gücü Data Collector Set (DCS) yapısında gizlidir. Tanımladığınız counterları belirli aralıklarla otomatik olarak kaydeder, raporlar üretir ve hatta alert gönderebilirsiniz.
GUI üzerinden şu adımları izleyin:
- Performance Monitor > Data Collector Sets > User Defined > New > Data Collector Set
- “Create manually (Advanced)” seçin
- Performance counters ekleyin
- Örnekleme aralığını belirleyin (production için 15-30 saniye yeterlidir)
- Çıktı dizinini ve formatını ayarlayın
Ama ben bunu genellikle PowerShell ile yapıyorum, çünkü onlarca sunucuda aynı konfigürasyonu uygulamak gerektiğinde tek seçenek bu:
# Yeni bir Data Collector Set oluştur
$CollectorSet = New-Object -COM Pla.DataCollectorSet
$CollectorSet.DisplayName = "Production_Baseline"
$CollectorSet.Duration = 86400 # 24 saat saniye cinsinden
$Collector = $CollectorSet.DataCollectors.CreateDataCollector(0)
$Collector.Name = "PerfLog"
$Collector.FileName = "PerfLog"
$Collector.FileNameFormat = 0x1
$Collector.LogAppend = $false
$Collector.SampleInterval = 15
$Collector.PerformanceCounters.Add("Processor(_Total)% Processor Time")
$Collector.PerformanceCounters.Add("MemoryAvailable MBytes")
$Collector.PerformanceCounters.Add("LogicalDisk(_Total)Disk Reads/sec")
$Collector.PerformanceCounters.Add("LogicalDisk(_Total)Disk Writes/sec")
$Collector.PerformanceCounters.Add("Network Interface(*)Bytes Total/sec")
$CollectorSet.Commit("Production_Baseline", $null, 0x0003) | Out-Null
$CollectorSet.Start()
Write-Host "Data Collector Set baslatildi."
Uzak Sunucuları İzlemek
PerfMon’un en az bilinen ama en çok işe yarayan özelliği uzak sunucuları izleme kabiliyetidir. Firewall açık olduğu ve Remote Registry servisi çalıştığı sürece başka bir sunucunun counterlarını kendi makinenizden okuyabilirsiniz.
# Uzak sunucudan anlık veri al
typeperf "\SUNUCU01Processor(_Total)% Processor Time" -sc 5
# Birden fazla sunucuyu aynı anda izle
typeperf "\SUNUCU01Processor(_Total)% Processor Time" "\SUNUCU02Processor(_Total)% Processor Time" -sc 10 -si 5
# Counter listesini dosyadan oku
typeperf -cf C:counters.txt -si 10 -sc 120 -f CSV -o C:Logsmultiserver.csv
counters.txt dosyasına her satıra bir counter yazmanız yeterlidir. Bu sayede 20 sunucuyu, 50 farklı counter ile 2 saat boyunca izleyip tek bir CSV dosyasına dökebilirsiniz. Bunu bir bakım penceresi öncesinde baseline almak için düzenli olarak kullanıyorum.
Kritik Counterlar ve Eşik Değerleri
Her metriği izlemek anlamsız, hatta gürültü yaratır. Deneyimlerime göre production Windows sunucularda kesinlikle takip etmeniz gereken counterlar şunlar:
CPU ile ilgili:
- Processor(_Total)% Processor Time: Sürekli %85 üzerindeyse sorun var
- Processor(_Total)% Privileged Time: Kernel modunda geçen süre, %25 üzeri şüphelidir
- SystemProcessor Queue Length: Çekirdek başına 2’den fazlası CPU darboğazı işareti
Bellek ile ilgili:
- MemoryAvailable MBytes: Hiçbir zaman toplam RAM’in %10’unun altına düşmemeli
- MemoryPages/sec: Sürekli 20 üzerindeyse disk swap’ı oluyor demektir
- MemoryPage Faults/sec: Ani artışlar bellek baskısını gösterir
Disk ile ilgili:
- LogicalDisk(_Total)% Disk Time: %90 üzeri kritik
- LogicalDisk(_Total)Avg. Disk Queue Length: 2’nin üzerinde problem var
- LogicalDisk(_Total)Avg. Disk sec/Transfer: 20ms üzeri SLA’yı etkiler
Ağ ile ilgili:
- Network Interface(*)Output Queue Length: 0 olmalı, sürekli artıyorsa NIC darboğazı var
- Network Interface(*)Packets Outbound Errors: Sıfır olmalı
Gerçek Dünya Senaryosu: SQL Server Yavaşlaması
Birkaç ay önce bir müşterinin SQL Server’ında sorgular beklenmedik şekilde yavaşlamaya başladı. Uygulama ekibi sorunu “database’de bir şeyler var” diye geçiştiriyordu. PerfMon ile baktığımda tablo netleşti.
Önce şu counterları topladım:
# SQL Server spesifik counterlar
typeperf "SQLServer:Buffer ManagerBuffer cache hit ratio" `
"SQLServer:Buffer ManagerPage reads/sec" `
"SQLServer:General StatisticsUser Connections" `
"SQLServer:SQL StatisticsBatch Requests/sec" `
"SQLServer:Wait Statistics(*)Lock waits" `
"LogicalDisk(D:)Avg. Disk sec/Read" `
-si 10 -sc 180 -f CSV -o C:Logssql_diagnosis.csv
Sonuç çarpıcıydı: Buffer cache hit ratio %78’e düşmüştü (normalde %99+ olmalı) ve Avg. Disk sec/Read değeri 45ms’ye çıkmıştı. Sorun SQL Server değil, disk alt yapısıydı. Storage ekibi LUN’u yanlış bir tier’a taşımıştı. PerfMon olmasa bunu bulmak saatler alırdı.
Alert Yapılandırması
Data Collector Set içinde Alert tipi collector oluşturabilirsiniz. Eşik değeri aşıldığında event log’a yazar, servis başlatır veya betik çalıştırabilirsiniz.
# PowerShell ile alert oluştur
$AlertSet = New-Object -COM Pla.DataCollectorSet
$AlertSet.DisplayName = "CPU_Alert"
$Alert = $AlertSet.DataCollectors.CreateDataCollector(3) # 3 = Alert tipi
$Alert.Name = "HighCPU"
$Alert.AlertThresholds.Add("Processor(_Total)% Processor Time>85")
$Alert.SampleInterval = 30
$Alert.Task = "CPU_High_Task" # Görev Zamanlayıcı'daki görev adı
$Alert.TaskArguments = "/sunucu:{computer} /counter:{counter} /deger:{value}"
$AlertSet.Commit("CPU_Alert", $null, 0x0003) | Out-Null
$AlertSet.Start()
Alert tetiklendiğinde çalışacak PowerShell betiğini de şöyle yazabilirsiniz:
# C:ScriptsCPU_High.ps1
param(
[string]$Sunucu,
[string]$Counter,
[string]$Deger
)
$Mesaj = "UYARI: $Sunucu sunucusunda CPU kullanimi %$Deger seviyesine ulasti."
$SmtpClient = New-Object System.Net.Mail.SmtpClient("mail.sirket.local")
$SmtpClient.Send("[email protected]", "[email protected]", "CPU Alarmi - $Sunucu", $Mesaj)
# Event Log'a da yaz
Write-EventLog -LogName "Application" -Source "PerfMon Alert" -EventId 9001 -EntryType Warning -Message $Mesaj
Raporları Analiz Etmek
PerfMon’un topladığı .blg dosyalarını analiz etmenin en iyi yolu yine PerfMon’un kendisidir. Ama büyük dosyalar için relog aracı çok işe yarar.
# BLG dosyasını CSV'e dönüştür
relog C:PerfLogsPerfLog_000001.blg -f CSV -o C:Analysisperflog.csv
# Belirli counterları filtrele
relog C:PerfLogsPerfLog_000001.blg -cf C:counters.txt -f CSV -o C:Analysisfiltered.csv
# Örnekleme sıklığını azalt (her 10 kayıttan 1 al)
relog C:PerfLogsPerfLog_000001.blg -t 10 -f CSV -o C:Analysissampled.csv
# Zaman aralığı belirt
relog C:PerfLogsPerfLog_000001.blg -b "01/15/2024 14:00:00" -e "01/15/2024 16:00:00" -f CSV -o C:Analysistimewindow.csv
CSV’e döktükten sonra Excel veya PowerShell ile analiz edebilirsiniz. Ben genellikle kritik bir incident sonrasında post-mortem için bu yöntemi kullanıyorum.
PowerShell ile Counter Verisi Almak
Modern ortamlarda PerfMon verilerini doğrudan PowerShell ile çekerek otomasyon akışlarına entegre edebilirsiniz.
# Anlık counter değeri al
$cpu = Get-Counter "Processor(_Total)% Processor Time"
$cpu.CounterSamples | Select-Object Path, CookedValue
# Birden fazla counter, birden fazla örnek
$counters = @(
"Processor(_Total)% Processor Time",
"MemoryAvailable MBytes",
"LogicalDisk(C:)% Disk Time"
)
$samples = Get-Counter -Counter $counters -SampleInterval 5 -MaxSamples 12
foreach ($sample in $samples.CounterSamples) {
[PSCustomObject]@{
Zaman = $sample.Timestamp
Counter = $sample.Path.Split("")[-1]
Deger = [math]::Round($sample.CookedValue, 2)
}
} | Export-Csv -Path C:Logsquickcheck.csv -NoTypeInformation
# Uzak sunucudan veri al
$remoteData = Get-Counter -ComputerName "SUNUCU01", "SUNUCU02" `
-Counter "Processor(_Total)% Processor Time" `
-SampleInterval 10 -MaxSamples 6
$remoteData.CounterSamples | Select-Object @{N="Sunucu";E={$_.Path.Split("\")[2]}}, CookedValue
Bu yaklaşımı bir monitoring scriptine entegre ettiğinizde, her gece otomatik olarak tüm sunuculara ait bir performans raporu üretebilirsiniz.
Scheduled Data Collector Set ile Baseline Alma
Production ortamında yapılan değişiklikler öncesinde ve sonrasında baseline karşılaştırması yapmak iyi bir pratiktir. Şöyle bir yapı kurabilirsiniz:
# Görev Zamanlayıcı ile DCS'i başlat
logman start "Production_Baseline"
# Belirli bir süre sonra durdur
Start-Sleep -Seconds 3600 # 1 saat
logman stop "Production_Baseline"
# Raporu dışa aktar
logman export "Production_Baseline" -xml C:Configsbaseline_config.xml
# Başka bir sunucuya aktar
logman import "Production_Baseline" -s SUNUCU02 -xml C:Configsbaseline_config.xml
logman aracı, PerfMon’un komut satırı yönetim aracıdır. DCS oluşturma, başlatma, durdurma ve konfigürasyon aktarımı için kullanılır. Özellikle logman import ile bir sunucudaki konfigürasyonu onlarca sunucuya dağıtmak çok pratiktir.
Yaygın Sorunlar ve Çözümleri
PerfMon kullanırken karşılaşılan tipik sorunlar ve çözümleri:
Counter görünmüyor: Bazı counterlar ilgili servis çalışmadığında listelenmez. SQL Server counterları örneğin SQL servisi başlayana kadar görünmez. lodctr /R komutu counter kayıt defterini yeniler.
Uzak sunucuya bağlanamıyor: Remote Registry servisi çalışıyor olmalı, Windows Firewall’da “Performance Logs and Alerts” kuralı açık olmalı. Ayrıca hedef sunucuda Performance Monitor Users grubuna kullanıcı eklemek gerekebilir.
BLG dosyaları çok büyüyor: Örnekleme aralığını artırın veya counter sayısını azaltın. Circular log kullanmak da disk dolmasını engeller.
Yüksek CPU olan ama kaynak bulunamayan durumlar: Process(*)% Processor Time counter’ını ekleyin, hangi process’in CPU yediğini process bazında görmüş olursunuz.
Sonuç
PerfMon, kutu içinde gelen ve büyük bütçe gerektirmeyen bir araç olmasına rağmen doğru kullanıldığında enterprise monitoring çözümlerini aratmaz. Temel mantığını anladıktan sonra Data Collector Set yapısı, alert mekanizması ve PowerShell entegrasyonu bir araya gelince gerçekten güçlü bir izleme altyapısı ortaya çıkıyor.
Ben bu aracı özellikle şu üç senaryoda vazgeçilmez buluyorum: Yeni bir sistemi devreye almadan önce baseline almak, bir incident sonrasında o zaman dilimine ait kayıtlı veriyi analiz etmek ve aylık kapasite planlama raporları için trend verisi toplamak. Bu üç kullanım dışında bile, bir sunucuya bağlandığınızda 30 saniye içinde genel durumu anlamak için typeperf’i bilmek yeterli.
Monitoring altyapınızı ilerletmek istiyorsanız PerfMon verilerini InfluxDB’ye yazıp Grafana’da görselleştiren çözümler de mevcut, onu da ayrı bir yazıda ele alalım.
