Windows Server’da Ağ Performansını İzleme ve Analiz

Yıllar önce bir müşterimizin veri merkezinde, gece yarısı ağ performansının neden bu kadar kötü olduğunu araştırırken şunu fark ettim: Çoğu sistem yöneticisi ağ sorunlarını ancak kullanıcılar şikayet etmeye başladıktan sonra fark ediyor. Oysa Windows Server üzerinde doğru araçları kullanırsanız, sorunlar henüz kritik hale gelmeden müdahale edebilirsiniz. Bu yazıda, Windows Server’da ağ performansını izlemek ve analiz etmek için gerçekten işe yarayan yöntemleri paylaşacağım.

Temel Kavramlar ve Neden Önemli

Ağ performansı izleme, sadece bant genişliği kullanımını takip etmekten ibaret değil. Gecikme (latency), paket kaybı, TCP yeniden iletim oranları, bağlantı sayıları ve protokol dağılımı gibi metriklerin hepsine bakmak gerekiyor. Windows Server bu konuda oldukça zengin araçlara sahip, ancak bu araçların nerede saklandığını ve nasıl kullanılacağını bilmek şart.

Özellikle şu senaryolarda ağ performansı izlemesi kritik hale geliyor:

  • Kullanıcılar intermittent yavaşlık şikayeti yapıyor ama ticket açmıyor
  • Yeni bir uygulama devreye alındıktan sonra genel ağ trafiği artıyor
  • DR tatbikatı öncesi mevcut durumu baseline olarak kayıt altına almak gerekiyor
  • Güvenlik ekibi olağandışı trafik patikası tespit etmek istiyor

Performance Monitor ile Başlamak

Windows’un yerleşik Performance Monitor (perfmon) aracı, düzgün yapılandırıldığında son derece güçlü bir izleme platformuna dönüşüyor. Komut satırından başlatmak için:

perfmon /res

Ağ performansı için izlemeniz gereken temel counter’lar şunlar:

  • Network InterfaceBytes Total/sec: Toplam ağ trafiği
  • Network InterfacePackets Received Errors: Hata paketleri
  • Network InterfacePackets Outbound Errors: Giden hata paketleri
  • TCPv4Connections Established: Aktif TCP bağlantıları
  • TCPv4Segments Retransmitted/sec: Yeniden iletilen segmentler, bu önemli
  • Network InterfaceCurrent Bandwidth: Anlık bant genişliği değeri

PowerShell ile bu counter’ları komut satırından toplamak çok daha pratik. Özellikle GUI’ye erişemediğiniz durumlarda bu komut hayat kurtarıyor:

Get-Counter -Counter "Network Interface(*)Bytes Total/sec", "TCPv4Segments Retransmitted/sec", "Network Interface(*)Packets Received Errors" -SampleInterval 5 -MaxSamples 12

Bu komut 5 saniyede bir örnek alarak 12 ölçüm yapıyor, yani 1 dakikalık bir snapshot veriyor. Acil müdahaleler sırasında bu kadar bile çok şey söyleyebilir.

Netstat ile Bağlantı Analizi

Eski ama altın değerinde bir araç. Windows Server’da netstat’ı doğru parametrelerle kullanmak büyük fark yaratıyor:

netstat -ano | findstr ESTABLISHED | Sort-Object

Aktif bağlantı sayısını bulmak için:

netstat -an | findstr ":443 " | findstr ESTABLISHED | Measure-Object | Select-Object Count

Hangi process’lerin en çok bağlantı kurduğunu görmek istediğinizde şu PowerShell one-liner’ı kullanabilirsiniz:

Get-NetTCPConnection -State Established | Group-Object OwningProcess | Sort-Object Count -Descending | Select-Object -First 10 | ForEach-Object { $proc = Get-Process -Id $_.Name -ErrorAction SilentlyContinue; [PSCustomObject]@{ProcessName=$proc.Name; PID=$_.Name; Connections=$_.Count} }

Bu komutun çıktısı size hangi servisin ağı en çok kullandığını gösteriyor. Bir keresinde bir müşteri sunucusunda bu komutu çalıştırdığımızda, yedekleme yazılımının beklenmedik saatlerde binlerce bağlantı açtığını ve bu yüzden üretim trafiğini etkilediğini tespit ettik.

Get-NetAdapterStatistics ile NIC Bazlı Analiz

Windows Server 2012 ve sonrasında gelen bu cmdlet, ağ kartı bazında detaylı istatistik sunuyor:

Get-NetAdapterStatistics -Name "*" | Select-Object Name, ReceivedBytes, SentBytes, ReceivedUnicastPackets, SentUnicastPackets, ReceivedDiscardedPackets, OutboundDiscardedPackets

Discarded packet sayısı yüksekse bu ciddi bir işaret. Genellikle şu nedenlerden kaynaklanıyor:

  • NIC buffer overflow, yani sunucu gelen trafiği işleyemiyor
  • RSS (Receive Side Scaling) yapılandırması eksik
  • NIC driver’ı eski veya hatalı
  • Fiziksel katmanda sorun var

Periyodik aralıklarla bu değerleri kaydetmek için şu scripti kullanabilirsiniz:

$outputPath = "C:LogsNetworkStats_$(Get-Date -Format 'yyyyMMdd_HHmmss').csv"
$interval = 30
$duration = 3600

$endTime = (Get-Date).AddSeconds($duration)
$results = @()

while ((Get-Date) -lt $endTime) {
    $stats = Get-NetAdapterStatistics -Name "*" | Select-Object Name, ReceivedBytes, SentBytes, ReceivedDiscardedPackets, OutboundDiscardedPackets, @{Name="Timestamp";Expression={Get-Date -Format "yyyy-MM-dd HH:mm:ss"}}
    $results += $stats
    Start-Sleep -Seconds $interval
}

$results | Export-Csv -Path $outputPath -NoTypeInformation
Write-Host "Veriler kaydedildi: $outputPath"

Bu script 1 saat boyunca 30 saniyede bir NIC istatistiklerini toplayıp CSV’ye yazıyor. Sabah işe geldiğinizde gece boyunca ne olduğunu görmek için ideal.

Network Monitor ve Message Analyzer Alternatifleri

Microsoft, Message Analyzer’ı 2019’da kullanımdan kaldırdı. Artık Wireshark ya da yerleşik pktmon aracı kullanılıyor. pktmon Windows Server 2019 ile birlikte geldi ve gerçek anlamda kullanışlı:

pktmon start --capture --comp nics --pkt-size 0 -f C:Logscapture.etl

Birkaç dakika sonra durdurmak için:

pktmon stop

ETL dosyasını okunabilir formata çevirmek için:

pktmon format C:Logscapture.etl -o C:Logscapture.txt

Ya da doğrudan pcapng formatına çevirerek Wireshark’ta açabilirsiniz:

pktmon pcapng C:Logscapture.etl -o C:Logscapture.pcapng

Canlı trafik analizi yapmak istediğinizde pktmon’un monitör modu işe yarıyor:

pktmon monitor --show-counters

Bu komut her bileşen için gerçek zamanlı paket sayacı gösteriyor. Bir paket nerede kaybolduğunu tespit etmek için mükemmel.

Windows Event Log ile Ağ Olaylarını İzleme

Çoğu zaman gözden kaçan bir kaynak: Windows Event Log. Ağ ile ilgili kritik olaylar burada kayıt altına alınıyor. PowerShell ile filtrelemek:

Get-WinEvent -FilterHashtable @{
    LogName = 'System'
    ProviderName = 'Tcpip', 'NetBT', 'DNS Client Events'
    StartTime = (Get-Date).AddHours(-24)
    Level = 1,2,3
} | Select-Object TimeCreated, ProviderName, Id, Message | Sort-Object TimeCreated -Descending

Event ID’ler konusunda dikkat etmeniz gerekenler:

  • Event ID 4227: TCP bağlantısı kaynak yetersizliği nedeniyle kurulamadı
  • Event ID 4231: TCP port exhaustion, ephemeral port bitti
  • Event ID 1014: DNS çözümleme başarısız, ağ erişilebilirlik sorunu
  • Event ID 5719: Domain controller’a ulaşılamıyor, ağ veya DNS sorunu

Port tükenmesi (port exhaustion) özellikle yoğun web servisi çalıştıran sunucularda sık karşılaşılan bir sorun. Mevcut durumu kontrol etmek için:

netsh int ipv4 show dynamicport tcp

Varsayılan olarak 49152-65535 aralığı kullanılıyor, yani yaklaşık 16.000 port. Büyük sistemlerde bu yetersiz gelebilir.

Bandwidth Kullanımını Gerçek Zamanlı İzleme

Basit ama etkili bir PowerShell scripti ile gerçek zamanlı bant genişliği kullanımı hesaplamak mümkün:

function Get-BandwidthUsage {
    param(
        [string]$AdapterName = "*",
        [int]$SampleCount = 10,
        [int]$Interval = 1
    )
    
    $previousStats = Get-NetAdapterStatistics -Name $AdapterName
    
    for ($i = 0; $i -lt $SampleCount; $i++) {
        Start-Sleep -Seconds $Interval
        $currentStats = Get-NetAdapterStatistics -Name $AdapterName
        
        foreach ($adapter in $currentStats) {
            $prev = $previousStats | Where-Object { $_.Name -eq $adapter.Name }
            if ($prev) {
                $rxMbps = [math]::Round((($adapter.ReceivedBytes - $prev.ReceivedBytes) * 8 / 1MB / $Interval), 2)
                $txMbps = [math]::Round((($adapter.SentBytes - $prev.SentBytes) * 8 / 1MB / $Interval), 2)
                
                Write-Host "[$($adapter.Name)] RX: $rxMbps Mbps | TX: $txMbps Mbps" -ForegroundColor Cyan
            }
        }
        $previousStats = $currentStats
        Write-Host "---"
    }
}

Get-BandwidthUsage -AdapterName "Ethernet*" -SampleCount 30 -Interval 2

Bu fonksiyon belirtilen NIC’ler için 2 saniyede bir RX/TX değerlerini Mbps cinsinden gösteriyor. Anında fikir veriyor.

NIC Teaming ve RSS Yapılandırması Kontrolü

Üretim ortamlarında NIC teaming ve RSS yapılandırması ağ performansını doğrudan etkiliyor. Mevcut durumu kontrol etmek için:

Get-NetLbfoTeam | Select-Object Name, TeamingMode, LoadBalancingAlgorithm, Status
Get-NetLbfoTeamMember | Select-Object Team, Name, AdministrativeMode, OperationalStatus

RSS durumunu kontrol etmek için:

Get-NetAdapterRss | Select-Object Name, Enabled, NumberOfReceiveQueues, MaxProcessorNumber

RSS aktif değilse veya yanlış yapılandırılmışsa, yoğun trafik altında tek bir CPU core’una yük bindirip darboğaz oluşturabilir. Bunu etkinleştirmek için:

Enable-NetAdapterRss -Name "Ethernet0"
Set-NetAdapterRss -Name "Ethernet0" -NumberOfReceiveQueues 4

Fiziksel sunucularda özellikle VMware veya Hyper-V altında çalışan misafir sistemlerde RSS ayarlarına dikkat etmek gerekiyor. Guest OS’ta RSS açık olsa bile hypervisor katmanında desteklenmiyorsa bir anlamı yok.

Uzun Süreli İzleme ve Baseline Oluşturma

Anlık ölçümler yanıltıcı olabilir. Gerçek analiz için baseline oluşturmak şart. Windows Server’ın Data Collector Set özelliği bu iş için biçilmiş kaftan:

$dcName = "NetworkBaseline"
$outputDir = "C:PerfLogsNetworkBaseline"

New-Item -ItemType Directory -Path $outputDir -Force

logman create counter $dcName `
    -o "$outputDir%computername%_network" `
    -f csv `
    -si 00:00:30 `
    -c "Network Interface(*)*" "TCPv4*" "UDPv4*" `
    -rf 01:00:00

logman start $dcName
Write-Host "Veri toplama başladı. 1 saat sonra otomatik duracak."

Bu komut 30 saniyede bir tüm ağ counter’larını toplayarak 1 saat boyunca CSV formatında kayıt yapıyor. Haftanın farklı günleri ve saatlerinde bu tür baseline’lar alırsanız, anormallikleri çok daha kolay tespit edersiniz.

Topladığınız CSV verilerini hızlıca analiz etmek için:

$csvFiles = Get-ChildItem -Path "C:PerfLogsNetworkBaseline" -Filter "*.csv" | Sort-Object Name
$allData = @()

foreach ($file in $csvFiles) {
    $data = Import-Csv -Path $file.FullName
    $allData += $data
}

$retransmitColumn = $allData | Get-Member -Name "*Retransmit*" | Select-Object -First 1 -ExpandProperty Name

if ($retransmitColumn) {
    $avgRetransmit = ($allData.$retransmitColumn | Where-Object { $_ -match '^d' } | ForEach-Object { [double]$_ } | Measure-Object -Average).Average
    Write-Host "Ortalama Retransmit/sec: $([math]::Round($avgRetransmit, 3))"
}

Gerçek Dünya Senaryosu: Yavaş Dosya Kopyalama Araştırması

Bir üretim ortamında klasik bir senaryo: kullanıcılar dosya sunucusuna kopyalamanın yavaşladığını söylüyor. Nereden başlayacaksınız?

Önce SMB istatistiklerine bakın:

Get-SmbServerConfiguration | Select-Object AutoShareServer, EnableSMB1Protocol, EnableSMB2Protocol, MaxThreadsPerQueue
Get-SmbSession | Measure-Object | Select-Object Count
Get-SmbOpenFile | Measure-Object | Select-Object Count

Ardından SMB performans counter’larına:

Get-Counter -Counter "SMB ServerBytes Total/sec", "SMB ServerRead Bytes/sec", "SMB ServerWrite Bytes/sec", "SMB ServerRequests/sec" -SampleInterval 5 -MaxSamples 6

Son olarak TCP retransmit oranına bakın. Yüksek retransmit oranı genellikle şu anlama geliyor: ağ katmanında paket kaybı var ya da MTU ayarları yanlış. MTU kontrolü için:

netsh interface ipv4 show subinterface
ping -f -l 1472 hedef_ip_adresi

Eğer 1472 byte’lık ping paketi fragmented olmadan geçiyorsa MTU sorun değil. Geçmiyorsa MTU değerini düşürmeniz gerekiyor.

Uyarı Eşikleri ve Aksiyon Alma

İzleme yapmak yetmez, eşik değerleri aşıldığında haberdar olmak gerekiyor. Basit bir PowerShell betiği ile e-posta uyarısı kurabilirsiniz:

$thresholds = @{
    RetransmitPerSec = 100
    PacketErrorRate = 0.01
    BandwidthUtilization = 0.85
}

$retransmit = (Get-Counter "TCPv4Segments Retransmitted/sec").CounterSamples[0].CookedValue
$nic = Get-NetAdapterStatistics -Name "Ethernet0" -ErrorAction SilentlyContinue
$bandwidth = (Get-NetAdapter -Name "Ethernet0").LinkSpeed -replace '[^0-9]', ''

if ($retransmit -gt $thresholds.RetransmitPerSec) {
    $message = "UYARI: TCP Retransmit orani yuksek! Deger: $retransmit /sn - Esik: $($thresholds.RetransmitPerSec)"
    Write-EventLog -LogName Application -Source "NetworkMonitor" -EventId 9001 -EntryType Warning -Message $message
    Write-Host $message -ForegroundColor Red
}

Event Log’a yazmak, SIEM sistemleriyle entegrasyon açısından önemli. Splunk, Elastic veya başka bir SIEM kullanıyorsanız bu olayları otomatik olarak yakalayabilirsiniz.

Sonuç

Windows Server’da ağ performansı izlemesi katmanlı bir yaklaşım gerektiriyor. Yerleşik araçlar olan perfmon, Get-NetAdapterStatistics, pktmon ve netstat, doğru kullanıldığında oldukça güçlü bir izleme altyapısı sunuyor. Üçüncü parti araçlara hemen atlamamak, önce bu araçları iyi anlamak gerekiyor.

Pratikte en çok değer gördüğüm üç alışkanlık:

  • Baseline almak: Sorun olmadan önce normal durumu kayıt altına almak, anormallikleri tespit etmeyi çok kolaylaştırıyor
  • Otomasyon kurmak: Manuel kontroller kaçırılıyor, scriptler çalışmaya devam ediyor
  • Log analizi: Event Log’ları düzenli incelemek, sorunları şikayet gelmeden fark etmenizi sağlıyor

Ağ sorunları her zaman ağdan kaynaklanmıyor; bazen uygulama, bazen disk I/O, bazen de DNS çözümleme sorunları ağ performansını etkiliyor gibi görünebiliyor. Bu yüzden ağ izlemeyi diğer sistem metrikleriyle birlikte değerlendirmek, doğru tanıya en hızlı şekilde ulaşmanızı sağlıyor.

Bir yanıt yazın

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