iperf3 ile Ağ Bant Genişliği Ölçümü

Ağ sorunlarını debug ederken “bant genişliği yeterli mi?” sorusu her sysadmin’in aklına gelir. Ping atarsın, traceroute çalıştırırsın ama bunlar sana gerçek throughput değerini vermez. İşte tam bu noktada iperf3 devreye giriyor. Basit, güvenilir ve neredeyse her Linux dağıtımında kullanılabilen bu araç, iki nokta arasındaki gerçek bant genişliğini ölçmeni sağlıyor. Bu yazıda iperf3’ü sıfırdan öğrenecek, gerçek dünya senaryolarında nasıl kullanacağını göreceksin.

iperf3 Nedir ve Neden Kullanılır?

iperf3, ağ performansını ölçmek için geliştirilmiş açık kaynaklı bir araçtır. Orijinal iperf projesinin yeniden yazılmış halidir ve 2010’ların ortasından itibaren standart haline gelmiştir. İki temel modda çalışır: server ve client. Bir uçta server başlatırsın, diğer uçtan client bağlanır ve aralarındaki bant genişliği ölçülür.

Neden iperf3’e ihtiyaç duyarsın?

  • Yeni kurduğun bir sunucu ile mevcut altyapı arasındaki bağlantıyı test etmek istiyorsun
  • Data center’lar arası bir link’in vadedilen kapasiteyi gerçekten karşılayıp karşılamadığını doğrulamak istiyorsun
  • Ağ ekibi ile “bizim taraf mı yavaş, sizin taraf mı?” tartışmasına son vermek istiyorsun
  • VPN tünelinin performans kaybına yol açıp açmadığını ölçmek istiyorsun
  • 10GbE kartını taktıktan sonra gerçekten 10Gbps alıp almadığını görmek istiyorsun

Kurulum

iperf3 neredeyse her büyük Linux dağıtımının resmi depolarında mevcut.

# Debian/Ubuntu
sudo apt update && sudo apt install iperf3

# RHEL/CentOS/Rocky Linux
sudo dnf install iperf3

# Arch Linux
sudo pacman -S iperf3

# macOS (Homebrew ile)
brew install iperf3

Windows için iperf3’ün resmi sitesinden binary indirilebilir. Ama bu yazının odağı Linux olacak.

Kurulumu doğrulamak için:

iperf3 --version

Temel Kullanım: İlk Ölçümün

iperf3’ü anlamak için önce basit bir senaryo deneyelim. İki makinemiz var: server01 (192.168.1.10) ve client01.

Server tarafında:

iperf3 -s

Bu kadar. iperf3 varsayılan olarak 5201 portunu dinlemeye başlar ve bağlantı bekler. Çıktı şu şekilde görünür:

-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------

Client tarafında:

iperf3 -c 192.168.1.10

Client 10 saniye boyunca test çalıştırır ve sonuçları gösterir:

Connecting to host 192.168.1.10, port 5201
[  5] local 192.168.1.20 port 54321 connected to 192.168.1.10 port 5201
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-1.00   sec  1.10 GBytes  9.43 Gbits/sec
[  5]   1.00-2.00   sec  1.12 GBytes  9.61 Gbits/sec
...
[  5]   0.00-10.00  sec  11.1 GBytes  9.52 Gbits/sec  sender
[  5]   0.00-10.04  sec  11.1 GBytes  9.48 Gbits/sec  receiver

Her satır 1 saniyelik aralıkları gösteriyor. En alttaki sender ve receiver satırları genel özeti veriyor.

Önemli Parametreler

Bağlantı Parametreleri

  • -s: Server modunda başlatır
  • -c [host]: Client modunda belirtilen host’a bağlanır
  • -p [port]: Varsayılan port (5201) yerine başka port kullanır
  • -B [adres]: Belirli bir network interface’e bind eder
  • -4: Yalnızca IPv4 kullanır
  • -6: Yalnızca IPv6 kullanır

Test Parametreleri

  • -t [saniye]: Test süresini belirler (varsayılan 10 saniye)
  • -n [boyut]: Süre yerine aktarılacak toplam veri miktarını belirler (örn: -n 1G)
  • -b [bandwidth]: Hedef bandwidth belirler, UDP testleri için kritik (örn: -b 100M)
  • -P [sayı]: Paralel stream sayısını belirler
  • -R: Reverse mod, server’dan client’a ölçüm yapar
  • -u: UDP protokolü kullanır (varsayılan TCP)
  • -l [boyut]: Buffer/segment boyutunu belirler
  • -w [boyut]: TCP window boyutunu ayarlar
  • -i [saniye]: Raporlama aralığını değiştirir (varsayılan 1 saniye)
  • -f [format]: Çıktı formatını değiştirir (k, m, g, K, M, G)
  • -J: JSON formatında çıktı verir
  • -Z: Zero-copy modunu etkinleştirir (daha az CPU kullanımı)

Server Parametreleri

  • -D: Daemon modunda çalıştırır
  • –one-off: Tek bağlantı sonrası server’ı kapatır
  • –logfile [dosya]: Log’ları dosyaya yazar

Gerçek Dünya Senaryoları

Senaryo 1: 10GbE Kart Testleri

Yeni bir 10GbE NIC taktın ve gerçekten 10Gbps alıp almadığını test etmek istiyorsun. Tek bir stream genellikle TCP window limitleri yüzünden tam hızı göstermez. Paralel stream kullanmak gerekir.

# Server tarafında
iperf3 -s

# Client tarafında, 8 paralel stream ile
iperf3 -c 192.168.1.10 -P 8 -t 30

-P 8 parametresi 8 ayrı TCP bağlantısı açar ve toplamda daha yüksek throughput elde edersin. -t 30 ise testi 30 saniyeye uzatarak daha stabil bir ortalama almanı sağlar.

Senaryo 2: UDP Testi ile Paket Kaybı ve Jitter Ölçümü

VoIP veya video streaming altyapısı kuruyorsun. TCP senin için yeterli değil çünkü UDP davranışını test etmen gerekiyor. Jitter ve paket kaybı kritik metrikler.

# UDP testi, 100Mbps hedef bandwidth ile
iperf3 -c 192.168.1.10 -u -b 100M -t 20

UDP testinde çıktıda ek metrikler görürsün:

[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams
[  5]   0.00-20.00  sec   238 MBytes  99.9 Mbits/sec  0.082 ms  12/171444 (0.007%)

Jitter değeri milisaniye cinsinden ve VoIP için 30ms altında olmalı. Lost/Total paket kaybı yüzdesini gösteriyor, %1’in altı genellikle kabul edilebilir. Eğer burada yüksek değerler görüyorsan switch’teki QoS ayarlarını veya buffer’ları gözden geçirmelisin.

Senaryo 3: Reverse Mod ile Upload/Download Testi

Bazen client’tan server’a değil, server’dan client’a olan bant genişliğini ölçmek istersin. Asimetrik bağlantılarda (DSL, VDSL, bazı fiber paketleri) upload ve download hızları farklıdır.

# Download hızını ölç (server -> client yönü)
iperf3 -c 192.168.1.10 -R -t 20

# Sonra upload hızını ölç (client -> server yönü)  
iperf3 -c 192.168.1.10 -t 20

Bu iki testi karşılaştırmak, asimetrik bir bottleneck’in tam olarak nerede olduğunu anlamana yardımcı olur.

Senaryo 4: JSON Çıktısı ve Otomasyon

Düzenli bant genişliği testleri yapıp sonuçları bir monitoring sistemine göndermek istiyorsun. JSON çıktısı bu iş için biçilmiş kaftan.

# JSON formatında test ve dosyaya kaydetme
iperf3 -c 192.168.1.10 -J -t 30 > /var/log/bandwidth_test_$(date +%Y%m%d_%H%M%S).json

Bu çıktıyı parse etmek için basit bir bash script:

#!/bin/bash

SERVER="192.168.1.10"
LOGDIR="/var/log/bandwidth_tests"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)

mkdir -p $LOGDIR

# Testi çalıştır ve JSON kaydet
iperf3 -c $SERVER -J -t 30 > $LOGDIR/test_$TIMESTAMP.json 2>&1

if [ $? -eq 0 ]; then
    # Mbps cinsinden sonucu çıkar
    BITS_PER_SEC=$(cat $LOGDIR/test_$TIMESTAMP.json | python3 -c "
import json, sys
data = json.load(sys.stdin)
bps = data['end']['sum_received']['bits_per_second']
print(f'{bps/1000000:.2f}')
")
    echo "[$TIMESTAMP] Bandwidth: $BITS_PER_SEC Mbps" >> $LOGDIR/bandwidth_history.log
    echo "Test tamamlandi: $BITS_PER_SEC Mbps"
else
    echo "[$TIMESTAMP] TEST BASARISIZ" >> $LOGDIR/bandwidth_history.log
fi

Bu script’i crontab’a ekleyerek periyodik monitoring yapabilirsin:

# Her gün gece 02:00'de test çalıştır
0 2 * * * /opt/scripts/bandwidth_test.sh

Senaryo 5: Firewall’dan Geçmek için Port Değiştirme

Production ortamında 5201 portunun güvenlik duvarı tarafından engellenmesi çok yaygın bir durum. Alternatif port kullanmak için:

# Server tarafında 443 portunda dinle
iperf3 -s -p 443

# Client tarafında aynı portu belirt
iperf3 -c 192.168.1.10 -p 443 -t 20

Tabii 443 üzerinde çalışan bir HTTPS servisi varsa çakışma olur. Bu durumda kullanılmayan başka bir port seçmek gerekir.

İleri Seviye Kullanım

Büyük TCP Window ile WAN Testi

Data center’lar arası veya yüksek latency’li WAN bağlantılarını test ediyorsan, varsayılan TCP window boyutu performansı kısıtlayabilir. Yüksek BDP (Bandwidth-Delay Product) değerlerine sahip linkler için window boyutunu artırmak gerekir.

# 256MB window size ile WAN testi
iperf3 -c uzak-sunucu.example.com -w 256M -t 30 -P 4

Bu özellikle İstanbul’dan Frankfurt’a giden bir link’te ya da 100ms üzeri RTT değerlerinde fark yaratır.

Bidirectional Test

iperf3 v3.7 ve sonrasında hem upload hem download’u aynı anda test edebilirsin:

# Bidirectional test (--bidir)
iperf3 -c 192.168.1.10 --bidir -t 20

Bu mod, full-duplex kapasiteyi test etmek için idealdir. Özellikle switch’lerin full-duplex çalışıp çalışmadığını verify etmek için kullanışlıdır.

Server’ı Daemon Olarak Çalıştırma

Production’da iperf3 server’ı sürekli çalışır halde tutmak istiyorsan systemd service dosyası oluşturmak en temiz yol:

# /etc/systemd/system/iperf3.service
sudo tee /etc/systemd/system/iperf3.service > /dev/null <<EOF
[Unit]
Description=iperf3 Network Bandwidth Testing Server
After=network.target

[Service]
ExecStart=/usr/bin/iperf3 -s -p 5201
Restart=always
RestartSec=5
User=nobody
Group=nogroup

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now iperf3
sudo systemctl status iperf3

Artık server reboot’tan sonra da otomatik başlayacak.

Farklı MTU ve Buffer Ayarları ile Test

Jumbo frame desteği olan bir ağ altyapısı kurduysanız, MTU ayarlarının doğru çalıştığını iperf3 ile test edebilirsiniz:

# 9000 byte MTU için uygun buffer boyutu ile test
iperf3 -c 192.168.1.10 -l 8192 -t 20 -P 4

-l parametresi read/write buffer boyutunu ayarlar. Normal MTU (1500) için varsayılan değer yeterli ama jumbo frame ortamında bu değeri büyütmek throughput’u artırabilir.

Sonuçları Yorumlamak

Test sonuçlarını okurken dikkat etmen gereken bazı noktalar var:

Sender vs Receiver farkı: Eğer sender ile receiver arasında büyük fark varsa, bu genellikle paket kaybına işaret eder. Sender’ın gönderdiği her şey karşı tarafa ulaşmıyor demektir.

Interval tutarsızlıkları: Her saniyeye ait değerler arasında büyük dalgalanmalar varsa, bu ağ congestion’ına, CPU saturation’ına veya depolama I/O problemlerine işaret edebilir. Benchmark değil, gerçek bir sorun var demektir.

Beklenen değerin çok altında çıkma: 1GbE bir link’te 950+ Mbps bekliyorsun ama 300-400 Mbps görüyorsun. Olası sebepler:

  • Duplex mismatch (bir taraf half-duplex, diğer full-duplex)
  • Ethernet kablo kalitesi problemi
  • NIC driver veya firmware sorunu
  • TCP offloading ayarları

CPU usage: Test sırasında sar 1 veya top ile CPU kullanımına bak. Eğer NIC bağlantı hızına yetişemeyecek kadar yüksek CPU kullanımı görüyorsan, NIC offloading özelliklerini etkinleştirmeyi dene:

# TCP segmentation offload durumunu kontrol et
ethtool -k eth0 | grep offload

# Generic receive offload etkinleştir
sudo ethtool -K eth0 gro on

# Test tekrar çalıştır
iperf3 -c 192.168.1.10 -t 30 -P 4

Güvenlik Notları

iperf3 server’ı internete açık bırakmak iyi bir fikir değil. Herhangi biri sunucuna bağlanıp bant genişliğini tüketebilir. Birkaç önlem:

# Sadece belirli bir IP'den bağlantı kabul et (firewall ile)
sudo iptables -A INPUT -p tcp --dport 5201 -s 10.0.0.0/8 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 5201 -j DROP

# Tek seferlik test için --one-off kullan
# Bir bağlantı gelince server kapanır
iperf3 -s --one-off

--one-off parametresi özellikle anlık testler için harika. Test bitince server kendiliğinden kapanır, ardından açık bırakma riski ortadan kalkar.

Alternatif Araçlarla Karşılaştırma

iperf3 her şey için mükemmel değil. Hangi durumda ne kullanmalısın:

  • iperf3: İki nokta arası raw TCP/UDP throughput ölçümü için ideal, uygulama katmanı yok
  • nload / iftop: Anlık ağ trafiğini izlemek için, test değil monitoring aracı
  • netperf: iperf3’e benzer ama latency odaklı testlerde daha zengin metrikler sunar
  • speedtest-cli: İnternet bağlantısını test etmek için, iperf3 gibi iki uç kontrol edemezsin
  • wrk / ab: HTTP performansı test etmek için, iperf3 uygulama katmanını görmez

Birini seçmek yerine duruma göre kombinasyon kullanmak en doğrusu. Örneğin önce iperf3 ile raw bant genişliğini ölçüp ardından wrk ile HTTP throughput’unu karşılaştırabilirsin. Aradaki fark uygulama overhead’ini gösterir.

Hızlı Referans

Aşağıdaki komutlar günlük işlerde en çok işe yarayacak kombinasyonlar:

# Temel test (10 saniye, tek stream)
iperf3 -c SUNUCU_IP

# Uzun ve güvenilir test (30 saniye, 4 paralel stream)
iperf3 -c SUNUCU_IP -t 30 -P 4

# Download hızı testi
iperf3 -c SUNUCU_IP -R -t 20

# UDP testi ile jitter ve paket kaybı
iperf3 -c SUNUCU_IP -u -b 1G -t 20

# JSON çıktısı ile kayıt
iperf3 -c SUNUCU_IP -J -t 30 | tee test_sonucu.json

# Özel port ile (firewall arkası)
iperf3 -c SUNUCU_IP -p 9000 -t 20

# WAN testi için büyük window ve paralel stream
iperf3 -c SUNUCU_IP -w 128M -P 8 -t 60

Sonuç

iperf3, sysadmin araç kutusunda olması gereken araçlardan biri. Kurulumu dakikalar içinde tamamlanıyor, tek bir komutla anlamlı sonuçlar veriyor ve uçtan uca network sorunlarını debug etmek için gerçekten güvenilir bir temel sağlıyor. “Ağ yavaş” gibi muğlak şikayetleri somut Mbps değerlerine dönüştürmek, hem sorunun kaynağını bulmayı hem de çözümü doğrulamayı kolaylaştırıyor.

En iyi yaklaşım, düzenli baseline ölçümleri almak. Altyapın sağlıklıyken iperf3 sonuçlarını kaydet, bir problem çıktığında karşılaştırmak için elindekileri kullan. Periyodik cron job ile bu testleri otomatikleştirirsen, bant genişliği düşüşlerini kullanıcılar şikayet etmeden önce sen fark edebilirsin. Bu da reaktif sysadmin olmaktan proaktif sysadmin olmaya geçişin küçük ama değerli bir adımı.

Yorum yapın