CMD ile Sistem Performansı İzleme: perfmon ve typeperf Kullanımı

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 _Total ya da 0 (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 logman ile sürekli çalışan, 30 dakikada bir rollover yapan bir koleksiyon kur
  • Disk sorunlarında Avg. Disk sec/Read ve Avg. Disk sec/Write değerlerine bak, bu değerler kuyruğa göre çok daha güvenilir
  • CPU sorunlarında sadece _Total değil bireysel çekirdeklere ve SystemProcessor Queue Length değerine de bak
  • Bellek sorunlarında Pages/sec 20’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.

Yorum yapın