Windows’ta Network Bant Genişliği Kullanımını İzleme ve Analiz Etme
Ağ trafiğini izlemek, sistem yöneticiliğinin en kritik görevlerinden biri. Özellikle Windows sunucularında bant genişliği kullanımını anlamak, hem performans sorunlarını çözmek hem de güvenlik anomalilerini tespit etmek açısından hayati önem taşıyor. “Sunucu yavaşladı” şikayeti aldığınızda ilk bakmanız gereken yerlerden biri ağ katmanı. Bu yazıda Windows ortamında bant genişliği izleme ve analizini, gerçek dünya senaryolarıyla birlikte ele alacağız.
Neden Bant Genişliği İzleme Bu Kadar Önemli?
Düşünün ki sabah 09:00’da şirketin ERP sistemi yavaşlamaya başladı. Sunucuya bağlandınız, CPU normal, RAM yeterli. Peki ağ trafiği nasıl? İşte tam bu noktada bant genişliği izleme devreye giriyor.
Gerçek hayattan bir senaryo: Bir müşterimizin Windows Server 2019 üzerinde çalışan dosya sunucusu, iş günlerinin ortasında düzenli olarak yavaşlıyordu. CPU ve bellek metrikleri normaldi. Ağ trafiğine baktığımızda gördük ki bir backup yazılımı öğle saatlerinde yüksek bant genişliği tüketiyordu ve bu da kullanıcıların dosya erişimini olumsuz etkiliyordu. Çözüm basitti: Backup zamanlamasını gece saatlerine almak. Ama bunu görmek için doğru araçlara ihtiyaç vardı.
Windows Performans Monitörü ile Temel İzleme
Windows’un yerleşik aracı Performance Monitor (perfmon), bant genişliği izleme için güçlü bir başlangıç noktası. Komut satırından şöyle başlatabilirsiniz:
perfmon /sys
Ancak asıl güç, komut satırı araçlarında yatıyor. typeperf komutu ile ağ arayüzü verilerini gerçek zamanlı olarak toplayabilirsiniz:
typeperf "Network Interface(*)Bytes Total/sec" -si 5 -sc 60 -o C:logsnetwork_monitor.csv
Bu komut şunu yapar:
- Network Interface(*)Bytes Total/sec: Tüm ağ arayüzlerindeki toplam byte/saniye değerini alır
- -si 5: Her 5 saniyede bir örnekleme yapar
- -sc 60: 60 örnek toplar (5 dakikalık veri)
- -o: Çıktıyı CSV dosyasına yazar
Daha spesifik metrikleri izlemek için:
typeperf "Network Interface(*)Bytes Sent/sec" "Network Interface(*)Bytes Received/sec" "Network Interface(*)Current Bandwidth" -si 10 -sc 120 -o C:logsnet_detailed.csv
PowerShell ile Bant Genişliği İzleme
PowerShell, Windows ağ izlemesinde gerçek bir güç aracı. Get-NetAdapterStatistics cmdlet’i ile anlık istatistiklere ulaşabilirsiniz:
Get-NetAdapterStatistics | Select-Object Name, ReceivedBytes, SentBytes, ReceivedUnicastPackets, SentUnicastPackets | Format-Table -AutoSize
Ancak anlık değerler çoğu zaman yeterli değil. Aşağıdaki script, belirli bir süre boyunca bant genişliği kullanımını ölçer ve Mbps cinsinden gösterir:
$adapter = "Ethernet"
$interval = 2
while ($true) {
$stats1 = Get-NetAdapterStatistics -Name $adapter
Start-Sleep -Seconds $interval
$stats2 = Get-NetAdapterStatistics -Name $adapter
$receivedMbps = [math]::Round((($stats2.ReceivedBytes - $stats1.ReceivedBytes) * 8 / $interval) / 1MB, 2)
$sentMbps = [math]::Round((($stats2.SentBytes - $stats1.SentBytes) * 8 / $interval) / 1MB, 2)
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
Write-Host "[$timestamp] Alinan: $receivedMbps Mbps | Gonderilen: $sentMbps Mbps"
Add-Content -Path "C:logsbandwidth_log.txt" -Value "[$timestamp] RX: $receivedMbps Mbps | TX: $sentMbps Mbps"
}
Bu script’i Task Scheduler ile otomatik çalıştırabilir, saatlik raporlar oluşturabilirsiniz.
netstat ile Bağlantı Analizi
Hangi süreçlerin ağı kullandığını görmek istiyorsanız netstat vazgeçilmez araçlardan biri:
netstat -ano | findstr ESTABLISHED
Parametre açıklamaları:
- -a: Tüm aktif bağlantıları ve dinleyen portları gösterir
- -n: Sayısal format, DNS çözümlemesi yapmaz (hızlı çalışır)
- -o: Her bağlantı için PID (Process ID) gösterir
PID’yi bulduktan sonra hangi sürecin ağı kullandığını öğrenmek için:
tasklist /FI "PID eq 4832" /FO LIST
Daha kapsamlı bir analiz için şu PowerShell komutunu kullanabilirsiniz:
Get-NetTCPConnection -State Established |
Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, OwningProcess |
ForEach-Object {
$proc = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue
[PSCustomObject]@{
LocalAddress = $_.LocalAddress
LocalPort = $_.LocalPort
RemoteAddress = $_.RemoteAddress
RemotePort = $_.RemotePort
ProcessName = $proc.Name
PID = $_.OwningProcess
}
} | Sort-Object ProcessName | Format-Table -AutoSize
Bu komut size hangi sürecin hangi uzak adrese bağlandığını net bir şekilde gösterir. Beklenmedik bir dış IP adresine bağlantı görürseniz, bu güvenlik açısından da önemli bir sinyal.
Resource Monitor ile Görsel Analiz
Komut satırı her zaman yeterli olmayabilir. Windows’un yerleşik Resource Monitor aracı, ağ kullanımını süreç bazında görsel olarak sunar:
resmon.exe
Resource Monitor’ün Network sekmesinde şunları görebilirsiniz:
- Processes with Network Activity: Ağ kullanan süreçler ve byte/saniye değerleri
- Network Activity: Aktif bağlantılar ve trafik detayları
- TCP Connections: Tüm TCP bağlantıları
- Listening Ports: Dinleyen portlar
Gerçek dünya senaryosu: Bir Windows sunucusunda anti-virüs yazılımının gece 02:00’de imza güncellemesi yapması sırasında bant genişliğinin %80’ini kullandığını Resource Monitor sayesinde tespit ettik. Bu bilgiyle güncelleme saatini daha uygun bir zaman dilimine aldık.
WMI ile Özelleştirilmiş İzleme
Windows Management Instrumentation (WMI), sistem bilgilerine programatik erişim için güçlü bir arayüz sunar. Ağ adaptörü istatistiklerini WMI üzerinden çekmek için:
Get-WmiObject -Class Win32_PerfFormattedData_Tcpip_NetworkInterface |
Select-Object Name, BytesReceivedPersec, BytesSentPersec, CurrentBandwidth |
ForEach-Object {
$rxMbps = [math]::Round($_.BytesReceivedPersec * 8 / 1MB, 3)
$txMbps = [math]::Round($_.BytesSentPersec * 8 / 1MB, 3)
$totalBwMbps = [math]::Round($_.CurrentBandwidth / 1MB, 0)
Write-Host "Arayuz: $($_.Name)"
Write-Host " Alinan: $rxMbps Mbps"
Write-Host " Gonderilen: $txMbps Mbps"
Write-Host " Toplam Kapasite: $totalBwMbps Mbps"
Write-Host "---"
}
Bu script, sisteminizdeki tüm ağ adaptörlerinin anlık kullanımını Mbps cinsinden gösterir.
Uyarı Sistemi Kurma
İzleme yapmak yeterli değil, anormal durumlarda uyarı almanız gerekiyor. Aşağıdaki script, bant genişliği kullanımı belirli bir eşiği aştığında e-posta gönderir:
param(
[string]$AdapterName = "Ethernet",
[double]$ThresholdMbps = 800,
[string]$SmtpServer = "mail.sirket.local",
[string]$AlertEmail = "[email protected]"
)
function Get-BandwidthMbps {
param([string]$Adapter, [int]$IntervalSec = 3)
$s1 = Get-NetAdapterStatistics -Name $Adapter
Start-Sleep -Seconds $IntervalSec
$s2 = Get-NetAdapterStatistics -Name $Adapter
$totalBytes = ($s2.ReceivedBytes - $s1.ReceivedBytes) + ($s2.SentBytes - $s1.SentBytes)
return [math]::Round(($totalBytes * 8 / $IntervalSec) / 1MB, 2)
}
while ($true) {
$currentMbps = Get-BandwidthMbps -Adapter $AdapterName
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
Write-Host "[$timestamp] Bant genisligi kullanimi: $currentMbps Mbps"
if ($currentMbps -gt $ThresholdMbps) {
$subject = "UYARI: Yuksek Bant Genisligi Kullanimi - $env:COMPUTERNAME"
$body = "Sunucu: $env:COMPUTERNAME`nZaman: $timestamp`nKullanim: $currentMbps Mbps`nEsik: $ThresholdMbps Mbps"
Send-MailMessage -SmtpServer $SmtpServer -From "[email protected]" `
-To $AlertEmail -Subject $subject -Body $body
Write-Warning "Uyari emaili gonderildi! Kullanim: $currentMbps Mbps"
}
Start-Sleep -Seconds 30
}
Bu script’i bir Windows Service olarak veya Task Scheduler üzerinden çalıştırabilirsiniz.
Wireshark ile Derin Paket Analizi
Bazen sadece “ne kadar bant genişliği kullanılıyor” yetmez, “hangi trafik bu bant genişliğini kullanıyor” sorusunun cevabını da ararsınız. Wireshark bu noktada devreye girer. GUI aracı olmasına rağmen, tshark adlı komut satırı versiyonu sunucularda çok kullanışlı:
tshark -i "Ethernet" -a duration:60 -q -z io,stat,10,"ip" 2>&1
Parametre açıklamaları:
- -i “Ethernet”: İzlenecek ağ arayüzü
- -a duration:60: 60 saniye sonra otomatik durdur
- -q: Sessiz mod, sadece istatistikleri göster
- -z io,stat,10: 10 saniyelik aralıklarla I/O istatistikleri
Belirli bir IP adresinin trafiğini analiz etmek için:
tshark -i "Ethernet" -f "host 192.168.1.50" -a duration:120 -w C:captureshost_capture.pcap
Bu yakalama dosyasını daha sonra Wireshark GUI’de açıp detaylı analiz yapabilirsiniz.
Windows Server’da Yerleşik Ağ İzleme Araçları
NIC Teaming İzleme
Sunucunuzda NIC Teaming kullanıyorsanız, her bir fiziksel adaptörün yükünü izlemek önemli:
Get-NetLbfoTeamMember | ForEach-Object {
$stats = Get-NetAdapterStatistics -Name $_.Name
Write-Host "Uye: $($_.Name) | RX: $($stats.ReceivedBytes) bytes | TX: $($stats.SentBytes) bytes"
}
DNS ve DHCP Sunucu Trafik Analizi
Windows Server’ın DNS veya DHCP sunucusu rolü varsa, bu servislerin trafik yükünü de izlemelisiniz:
$dnsCounters = Get-Counter -Counter "DNSTotal Query Received/sec","DNSTotal Response Sent/sec" -SampleInterval 5 -MaxSamples 12
$dnsCounters.CounterSamples | ForEach-Object {
Write-Host "$($_.Path): $([math]::Round($_.CookedValue, 2))"
}
Log Tabanlı Uzun Vadeli Analiz
Kısa vadeli izleme anlık sorunları çözer, ancak trend analizi için uzun vadeli log toplamaya ihtiyaç duyarsınız. Aşağıdaki script saatlik bant genişliği raporları oluşturur:
$logPath = "C:NetworkLogs"
$reportFile = Join-Path $logPath "hourly_report_$(Get-Date -Format 'yyyyMMdd_HH').csv"
if (-not (Test-Path $logPath)) {
New-Item -ItemType Directory -Path $logPath | Out-Null
}
$results = @()
$adapters = Get-NetAdapter | Where-Object { $_.Status -eq "Up" }
foreach ($adapter in $adapters) {
$samples = @()
for ($i = 0; $i -lt 12; $i++) {
$s1 = Get-NetAdapterStatistics -Name $adapter.Name
Start-Sleep -Seconds 5
$s2 = Get-NetAdapterStatistics -Name $adapter.Name
$rxMbps = [math]::Round((($s2.ReceivedBytes - $s1.ReceivedBytes) * 8 / 5) / 1MB, 2)
$txMbps = [math]::Round((($s2.SentBytes - $s1.SentBytes) * 8 / 5) / 1MB, 2)
$samples += ($rxMbps + $txMbps)
}
$avgMbps = [math]::Round(($samples | Measure-Object -Average).Average, 2)
$maxMbps = [math]::Round(($samples | Measure-Object -Maximum).Maximum, 2)
$results += [PSCustomObject]@{
Timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
AdapterName = $adapter.Name
AvgMbps = $avgMbps
MaxMbps = $maxMbps
LinkSpeed = "$([math]::Round($adapter.LinkSpeed / 1GB, 0)) Gbps"
}
}
$results | Export-Csv -Path $reportFile -NoTypeInformation -Encoding UTF8
Write-Host "Rapor olusturuldu: $reportFile"
Bu script’i Task Scheduler ile her saat çalışacak şekilde ayarlarsanız, aylık trafik trendlerini Excel’de analiz edebilirsiniz.
Üçüncü Parti Araçlar
Yerleşik araçlar güçlü olsa da bazı durumlarda daha kapsamlı çözümler gerekebilir:
- PRTG Network Monitor: Kurumsal ortamlar için kapsamlı izleme, ücretsiz sürümde 100 sensöre kadar izin veriyor
- SolarWinds Network Performance Monitor: Büyük ağlar için güçlü ama maliyetli
- Nagios/Zabbix: Açık kaynak, Windows agent ile mükemmel entegrasyon
- Grafana + Prometheus + windows_exporter: Modern yaklaşım, dashboard oluşturma konusunda çok esnek
- NetFlow Analyzer: NetFlow protokolü destekleyen switch/router varsa trafik analizi için ideal
PRTG veya Zabbix tercih ettiğimde genellikle şu metrikleri izliyorum:
- Bandwidth utilization: 5 dakikalık ortalama
- Packet loss rate: %1 üzeri kritik
- Network error rate: Interface hatalarının artışı
- Top talkers: En çok bant genişliği kullanan IP adresleri
Güvenlik Perspektifinden Ağ İzleme
Bant genişliği izleme sadece performans meselesi değil, güvenlik açısından da kritik. Anormal trafik örüntüleri şunlara işaret edebilir:
- Gece saatlerinde yüksek outbound trafik: Veri sızıntısı veya botnet aktivitesi
- Broadcast storm: Ağ döngüsü veya yanlış yapılandırılmış cihaz
- Ani trafik artışları: DDoS saldırısı veya kötü amaçlı yazılım yayılması
- Bilinmeyen dış IP bağlantıları: Zararlı yazılım C2 iletişimi
Şüpheli bir durumda hızlıca hangi sürecin hangi dış adrese bağlandığını görmek için:
$connections = Get-NetTCPConnection -State Established |
Where-Object { $_.RemoteAddress -notlike "10.*" -and
$_.RemoteAddress -notlike "192.168.*" -and
$_.RemoteAddress -notlike "172.16.*" -and
$_.RemoteAddress -ne "127.0.0.1" }
$connections | ForEach-Object {
$proc = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue
Write-Host "Proses: $($proc.Name) (PID: $($_.OwningProcess)) -> $($_.RemoteAddress):$($_.RemotePort)"
}
Bu komut, yerel ağ dışındaki tüm aktif bağlantıları ve bunları oluşturan süreçleri listeler. Tanımadığınız bir süreç beklenmedik bir dış adrese bağlanıyorsa, bu acil müdahale gerektiren bir durum olabilir.
Performans Temel Çizgisi Oluşturma
İyi bir izleme altyapısı için önce normalin ne olduğunu bilmeniz gerekir. Baseline (temel çizgi) oluşturmak bu yüzden önemli. Birkaç hafta boyunca saatlik veri toplayın ve şu değerleri belirleyin:
- İş saatleri ortalaması (08:00-18:00)
- Gece ortalaması (18:00-08:00)
- Haftalık peak değerleri
- Maksimum gözlemlenen kullanım
Bu baseline’ı belirledikten sonra uyarı eşiklerinizi şöyle ayarlayabilirsiniz:
- Uyarı: Baseline peak değerinin %150’si
- Kritik: Baseline peak değerinin %200’si veya link kapasitesinin %85’i
Sorun Giderme Senaryoları
Senaryo 1: Yavaş dosya transferleri
Kullanıcılar dosya kopyalamanın yavaş olduğundan şikayet ediyor. Önce adaptör hızını kontrol edin:
Get-NetAdapter | Select-Object Name, Status, LinkSpeed, FullDuplex
Duplex mismatch (yarı/tam çift yönlü uyumsuzluğu) en sık karşılaşılan sorunlardan biri. Adaptör full-duplex iken switch half-duplex çalışıyorsa veya tam tersi, ciddi performans kaybı yaşanır.
Senaryo 2: Intermittent bağlantı sorunları
Aralıklı bağlantı sorunlarında paket kaybını izleyin:
$target = "8.8.8.8"
1..100 | ForEach-Object {
$result = Test-Connection -ComputerName $target -Count 1 -ErrorAction SilentlyContinue
if ($result) {
Write-Host "Basarili - RTT: $($result.ResponseTime)ms"
} else {
Write-Warning "Paket kaybi tespit edildi! ($_. deneme)"
}
Start-Sleep -Milliseconds 500
}
Sonuç
Windows’ta ağ bant genişliği izleme ve analizi, hem yerleşik araçları hem de özelleştirilmiş scriptleri kapsayan çok katmanlı bir süreç. typeperf ve netstat ile hızlı anlık analizler yapabilirken, PowerShell scriptleri ile otomatik raporlama ve uyarı sistemleri kurabilirsiniz. Wireshark ve tshark ise derin paket analizine ihtiyaç duyduğunuzda devreye giriyor.
Önemli olan sadece araçları bilmek değil, doğru soruları sormak. “Sunucu neden yavaş?” sorusunun cevabını çoğu zaman ağ trafiği verisinde bulursunuz. Baseline oluşturmak, düzenli raporlama yapmak ve anormal durumlarda otomatik uyarı almak, proaktif sistem yönetiminin temel taşları. Güvenlik perspektifini de unutmamalısınız: Anormal outbound trafik bazen bir performans sorunundan çok daha ciddi bir soruna işaret edebilir.
Ağ izleme konusunda kasları geliştirmenin en iyi yolu pratik yapmak. Ortamınızda bu scriptleri çalıştırın, kendi baseline değerlerinizi oluşturun ve zamanla hangi örüntülerin normal, hangilerinin anormal olduğunu öğrenin. Bu bilgi birikimi, bir sonraki ağ sorununu çözerken size ciddi zaman kazandıracak.
