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.
