Sunucularda bir şeyler ters gittiğinde ilk içgüdü genellikle Task Manager’ı açmak olur. Ama production ortamında RDP açık değilse, script ile otomatize etmen gerekiyorsa ya da uzun süreli veri toplamak istiyorsan, CMD üzerinden çalışan typeperf ve perfmon araçları hayat kurtarır. Bu yazıda Windows Server üzerinde komut satırından sistem performansını nasıl izleyeceğini, verileri nasıl kaydedeceğini ve anlamlı sonuçlar çıkaracağını adım adım inceleyeceğiz.
Temel Kavramlar: Performance Counter Nedir?
Windows’ta her sistem kaynağı için Performance Counter adı verilen metrikler mevcuttur. CPU kullanımından disk I/O’ya, network trafiğinden bellek sayfalamasına kadar yüzlerce hazır sayaç bulunur. Bu sayaçlar üç bileşenden oluşur:
- Object (Nesne): Sayacın ait olduğu kaynak grubu, örneğin
Processor,Memory,PhysicalDisk - Counter (Sayaç): Ölçülen metrik, örneğin
% Processor Time,Available MBytes - Instance (Örnek): Birden fazla kaynak varsa hangisi, örneğin
_Totalya da0(ilk CPU çekirdeği)
Tam sözdizimi şu şekildedir: Object(Instance)Counter
Örneğin: Processor(_Total)% Processor Time
typeperf Komutuna Giriş
typeperf, performans sayaçlarını komut satırından sorgulayan ve sonuçları hem ekrana hem de dosyaya yazan bir araçtır. Windows’un tüm modern sürümlerinde varsayılan olarak gelir, ek kurulum gerekmez.
Temel Kullanım
En basit haliyle bir sayacı anlık sorgulamak:
typeperf "Processor(_Total)% Processor Time"
Bu komut sürekli çalışır ve her saniye CPU kullanım yüzdesini ekrana basar. Durdurmak için Ctrl+C kullanırsın.
Belirli sayıda örnek almak için -sc parametresini kullanırsın:
typeperf "Processor(_Total)% Processor Time" -sc 10
Bu komut 10 ölçüm yapıp çıkar. Script içinde kullanırken bu parametre çok işe yarar çünkü komutu manuel durdurmana gerek kalmaz.
Örnekleme Aralığını Ayarlamak
Varsayılan örnekleme aralığı 1 saniyedir. Bunu -si parametresiyle değiştirebilirsin:
typeperf "Processor(_Total)% Processor Time" -si 5 -sc 12
Bu komut her 5 saniyede bir ölçüm yapar, toplamda 12 ölçüm alır ve 1 dakikalık veri toplar.
Önemli Performans Sayaçları
CPU Sayaçları
typeperf "Processor(_Total)% Processor Time" "Processor(_Total)% Privileged Time" "Processor(_Total)% Interrupt Time" -sc 5
- % Processor Time: Toplam CPU kullanımı, en temel metrik
- % Privileged Time: Kernel modunda geçen süre, yüksekse sürücü veya sistem çağrısı sorunu olabilir
- % Interrupt Time: Donanım kesmelerinde geçen süre, anormal yüksekse NIC veya disk sorunu araştır
Bellek Sayaçları
typeperf "MemoryAvailable MBytes" "MemoryPages/sec" "MemoryPage Faults/sec" -sc 10 -si 2
- Available MBytes: Kullanılabilir fiziksel bellek, kritik eşik genellikle toplam RAM’in %10’u
- Pages/sec: Saniyede sayfaya yazılan/okunan veri, sürekli yüksekse RAM yetersiz
- Page Faults/sec: Sayfa hatası sayısı, yüksek değerler memory pressure gösterir
Disk Sayaçları
typeperf "PhysicalDisk(_Total)% Disk Time" "PhysicalDisk(_Total)Avg. Disk Queue Length" "PhysicalDisk(_Total)Disk Reads/sec" "PhysicalDisk(_Total)Disk Writes/sec" -sc 10
- % Disk Time: Diskin meşgul olduğu süre, %80 üzeri sorunlu
- Avg. Disk Queue Length: Disk kuyruğu uzunluğu, disk başına 2’nin üzeri sorunlu
- Disk Reads/sec ve Writes/sec: Okuma/yazma operasyon sayısı
Network Sayaçları
typeperf "Network Interface(*)Bytes Total/sec" "Network Interface(*)Packets Received Errors" -sc 5
Burada * wildcard kullanarak tüm network interface’lerini izliyoruz. Birden fazla NIC varsa hepsinin verisi gelir.
Sonuçları Dosyaya Kaydetmek
Gerçek dünyada verileri ekranda izlemek yerine dosyaya kaydetmek çok daha kullanışlıdır. -o parametresiyle çıktıyı CSV dosyasına yönlendirebilirsin:
typeperf "Processor(_Total)% Processor Time" "MemoryAvailable MBytes" "PhysicalDisk(_Total)% Disk Time" -o C:Logsperformans_verisi.csv -sc 60 -si 10 -f CSV
Bu komut 10 saniyede bir ölçüm yaparak 60 ölçüm toplar, yani 10 dakikalık veri. -f CSV parametresi format belirleme içindir. Ayrıca -f TSV veya -f BIN formatları da kullanılabilir.
BIN formatı daha sonra Perfmon GUI ile açmak istersen kullanışlıdır:
typeperf "Processor(_Total)% Processor Time" -o C:Logsveri.blg -f BIN -sc 300 -si 2
Birden Fazla Sayacı Dosyadan Okumak
Çok sayıda sayacı tek komutla yönetmek istediğinde, sayaçları bir metin dosyasına yazıp -cf parametresiyle okutabilirsin:
Önce C:Scriptssayaclar.txt dosyası oluştur:
Processor(_Total)% Processor Time
Processor(_Total)% Privileged Time
MemoryAvailable MBytes
MemoryPages/sec
PhysicalDisk(_Total)% Disk Time
PhysicalDisk(_Total)Avg. Disk Queue Length
Network Interface(*)Bytes Total/sec
SystemProcessor Queue Length
Sonra bu dosyayı kullan:
typeperf -cf C:Scriptssayaclar.txt -o C:Logssunucu_performans.csv -f CSV -si 30 -sc 120
Bu komut 30 saniyede bir ölçüm alarak 1 saat boyunca veri toplar. Sabah sunucuyu bu şekilde bırakırsın, öğlen geldiğinde 1 saatlik detaylı veri seni bekler.
Mevcut Sayaçları Keşfetmek
Hangi sayaçların mevcut olduğunu bilmiyorsan typeperf -q ile sorgulayabilirsin:
typeperf -q > C:Logstum_sayaclar.txt
Bu komut sistemdeki tüm kullanılabilir sayaçları dosyaya yazar. Sonra metin editörüyle arayabilirsin. Belirli bir nesne için sayaçları listelemek istersen:
typeperf -q "Processor"
typeperf -q "Memory"
typeperf -q "PhysicalDisk"
Uzak Sunucuyu İzlemek
typeperf ile uzaktaki bir sunucunun performansını da izleyebilirsin. Bunun için sayaç adının başına sunucu adını eklersin:
typeperf "\WEBSERVER01Processor(_Total)% Processor Time" "\WEBSERVER01MemoryAvailable MBytes" -sc 10
Ya da -s parametresiyle sunucu adını belirtirsin:
typeperf -cf C:Scriptssayaclar.txt -s WEBSERVER01 -o C:Logswebserver01_perf.csv -f CSV -sc 60 -si 5
Bu özellik özellikle monitoring script yazarken çok değerlidir. Bir jump server’dan birden fazla sunucuyu tek script ile izleyebilirsin.
Gerçek Dünya Senaryo 1: Yüksek CPU Tespiti
Production’da bir uygulama sunucunun CPU’su %90 üzerinde seyrediyor ve müşteriler yavaşlık bildiriyor. RDP açmadan önce şu scripti çalıştırırsın:
typeperf "Processor(_Total)% Processor Time" "Processor(*)% Processor Time" "SystemProcessor Queue Length" "Process(*)% Processor Time" -o C:Logscpu_analiz_%date:~-4,4%%date:~-10,2%%date:~-7,2%.csv -f CSV -si 5 -sc 24
Bu komut 5 saniyede bir 24 ölçüm alır, yani 2 dakikalık veri toplar. Processor()% Processor Time ile bireysel çekirdek kullanımını da görürsün; eğer bir çekirdek %100 diğerleri düşükse, single-threaded bir process soruna yol açıyor demektir. Process()% Processor Time ise hangi sürecin CPU yediğini gösterir.
Dosyayı Excel’de açtığında kolayca filtreleyip en yüksek değerleri bulabilirsin.
Gerçek Dünya Senaryo 2: Bellek Sızıntısı İzleme
Bir servis haftalar içinde yavaş yavaş bellek tüketiyor şüphesi varsa, uzun süreli izleme gerekir:
typeperf "MemoryAvailable MBytes" "MemoryCommitted Bytes" "Process(IISWorkerProcess*)Private Bytes" "Process(IISWorkerProcess*)Virtual Bytes" -o C:Logsmemory_leak_izle.csv -f CSV -si 300 -sc 288
Bu komut 5 dakikada bir ölçüm alır ve 288 ölçüm yapar, yani tam 24 saatlik veri toplar. Private Bytes değeri IIS worker process için sürekli artıyorsa memory leak var demektir. Sabah bu komutu başlatırsın, ertesi sabah grafiği çizersin.
Gerçek Dünya Senaryo 3: Disk I/O Darboğazı
Veritabanı sunucusunun yavaş sorgu sorununda disk I/O’yu incelemek kritik önem taşır:
typeperf "PhysicalDisk(_Total)% Disk Time" "PhysicalDisk(_Total)Avg. Disk sec/Read" "PhysicalDisk(_Total)Avg. Disk sec/Write" "PhysicalDisk(_Total)Avg. Disk Queue Length" "PhysicalDisk(0 C:)% Disk Time" "PhysicalDisk(1 D:)% Disk Time" -o C:Logsdisk_io_analiz.csv -f CSV -si 10 -sc 60
- Avg. Disk sec/Read: Okuma gecikmesi, SSD için 1ms altı normal, HDD için 10ms altı makul
- Avg. Disk sec/Write: Yazma gecikmesi, benzer eşikler geçerli
- Disk başına izleme yaparak hangi volume’ün sorunlu olduğunu belirleyebilirsin
Scheduled Task ile Otomatik İzleme
typeperf‘i Windows Task Scheduler ile birleştirerek otomatik performans raporlama sistemi kurabilirsin. Önce bir batch script oluştur:
@echo off
setlocal
set TARIH=%date:~-4,4%%date:~-10,2%%date:~-7,2%
set SAAT=%time:~0,2%%time:~3,2%
set SAAT=%SAAT: =0%
set LOGDOSYA=C:PerfLogsperf_%TARIH%_%SAAT%.csv
echo Performans izleme basliyor: %LOGDOSYA%
typeperf -cf C:Scriptssayaclar.txt ^
-o %LOGDOSYA% ^
-f CSV ^
-si 60 ^
-sc 60
echo Tamamlandi. Log dosyasi: %LOGDOSYA%
Bu scripti C:Scriptsperf_izle.bat olarak kaydet. Sonra her saat başı çalışacak şekilde Task Scheduler’a ekle:
schtasks /create /tn "PerformansIzleme" /tr "C:Scriptsperf_izle.bat" /sc HOURLY /st 00:00 /ru SYSTEM /f
Her saat 1 saatlik veri toplanacak ve tarih-saat damgalı CSV dosyası oluşturulacak. Böylece sorun çıktığında ilgili saatin verisine bakabilirsin.
logman ile Data Collector Set Oluşturmak
logman komutu typeperf‘e kıyasla daha kurumsal bir yapı sunar. Başlatma/durdurma, zamanlanmış koleksiyon ve servis olarak çalıştırma gibi özellikler sağlar.
Data Collector Set oluşturmak:
logman create counter SunucuPerformans -cf C:Scriptssayaclar.txt -f csv -si 00:00:30 -o C:PerfLogssunucu_perf.csv --v
Oluşturulan koleksiyonu başlatmak:
logman start SunucuPerformans
Durdurmak:
logman stop SunucuPerformans
Koleksiyon hakkında bilgi almak:
logman query SunucuPerformans
Silmek:
logman delete SunucuPerformans
logman, typeperf‘ten farklı olarak arka planda servis gibi çalışır. Komutu çalıştırıp konsoldan çıksan bile veri toplamaya devam eder. Sunucularda uzun süreli izleme için bu yöntem çok daha sağlıklıdır.
Perfmon GUI ile Entegrasyon
Komut satırından topladığın BIN formatındaki verileri Perfmon GUI’de görselleştirebilirsin:
typeperf -cf C:Scriptssayaclar.txt -o C:Logsanaliz.blg -f BIN -si 10 -sc 360
Toplandıktan sonra perfmon /sys komutuyla Perfmon’u aç, “Performance Monitor” bölümüne gel, sağ tıkla “Properties” de ve “Source” sekmesinden “Log files” seçip BIN dosyasını ekle. Artık tüm verileri grafiksel olarak inceleyebilirsin.
Uyarı: Sayaç İsimlerinde Dikkat Edilecekler
Türkçe Windows sistemlerde bazen sayaç isimleri Türkçe olabilir. Örneğin Processor yerine İşlemci görülebilir. Bunu anlamak için:
typeperf -q > C:sayaclar.txt
type C:sayaclar.txt | findstr /i "processor"
type C:sayaclar.txt | findstr /i "memory"
Eğer İngilizce karşılığı bulamazsan sistemin dilinden kaynaklanan farklılık var demektir. Bu durumda ya İngilizce sayaç adını deneyebilir, ya da typeperf -q çıktısında doğru ismi bulabilirsin.
Ayrıca bazı sayaçlar sadece belirli roller kurulduğunda mevcut olur. Örneğin Web Service(*) sayaçları IIS kurulu olmadan görünmez.
PowerShell ile typeperf Çıktısını İşlemek
typeperf çıktısını PowerShell ile parse ederek anlık uyarı sistemi kurabilirsin:
for /f "tokens=2 delims=," %%a in ('typeperf "Processor(_Total)%% Processor Time" -sc 1 2^>nul ^| findstr /v "^("') do (
set CPU=%%~a
echo CPU Kullanimi: %%~a
)
Bu batch script anlık CPU değerini yakalar. PowerShell ile daha gelişmiş analiz yapılabilir ama CMD ortamında kalmak istiyorsan bu yöntem çalışır.
Sonuç
typeperf ve logman, Windows Server ortamında grafik arayüze ihtiyaç duymadan kapsamlı performans izleme imkanı sağlar. Günlük kullanımda şu pratikleri benimsemeni öneririm:
- Sorun çıkmadan önce temel performans değerlerini ölçerek baseline oluştur; sorun çıktığında neyle karşılaştıracağını bilirsin
- Önemli sunucularda
logmanile sürekli çalışan, 30 dakikada bir rollover yapan bir koleksiyon kur - Disk sorunlarında
Avg. Disk sec/ReadveAvg. Disk sec/Writedeğerlerine bak, bu değerler kuyruğa göre çok daha güvenilir - CPU sorunlarında sadece
_Totaldeğil bireysel çekirdeklere veSystemProcessor Queue Lengthdeğerine de bak - Bellek sorunlarında
Pages/sec20’nin üzerine çıkıyorsa sorun ciddiye alınmalı - Topladığın CSV verileri için basit bir Excel şablonu hazırla, filtreleme ve grafikle analiz çok kolaylaşır
Komut satırı tabanlı bu araçlar, RDP erişimi olmayan ortamlarda, WinRM üzerinden uzaktan çalışırken ya da monitoring script yazarken vazgeçilmez hale gelir. Bir kez alışkınlık kazandıktan sonra Task Manager’a muhtaç kalmadan çok daha derin analizler yapabildiğini göreceksin.