Bant Genişliği Sınırlama: rsync –bwlimit Kullanımı

Büyük bir dosya transferi başlatıyorsunuz, ağ trafiği tavan yapıyor, kullanıcılar “internet yok” diye şikayet etmeye başlıyor ve siz de yedekleme işlemini yarıda kesmek zorunda kalıyorsunuz. Tanıdık bir senaryo, değil mi? İşte tam bu noktada rsync’in --bwlimit parametresi hayat kurtarıcı oluyor. Bant genişliği sınırlaması, özellikle üretim ortamlarında yedekleme işlemlerini ağ performansını etkilemeden arka planda çalıştırmanın en pratik yolu.

–bwlimit Nedir ve Neden Lazım?

rsync, dosya transferlerinde bant genişliğini sınırlamak için --bwlimit parametresini sunar. Bu parametre, rsync’in ağ üzerinden veri aktarırken kullanabileceği maksimum bant genişliğini kilobayt/saniye (KB/s) cinsinden belirlemenizi sağlar.

Peki neden böyle bir şeye ihtiyaç var? Çünkü gerçek dünyada yedekleme işlemleri genellikle şu senaryolarda can sıkıcı hale gelir:

  • Mesai saatlerinde çalışan yedekler: 09:00-18:00 arası tam hızda çalışan bir rsync, ofisteki herkesin internet bağlantısını mahvedebilir.
  • Paylaşımlı upload hattı: Birden fazla sunucunun aynı çıkış bant genişliğini kullandığı ortamlarda kontrolsüz transferler çakışma yaratır.
  • Uzak lokasyon yedekleri: İki şube arasındaki dedicated hat hem VoIP hem de yedekleme trafiğini taşıyorsa önceliklendirme şart.
  • Bulut yedekleme maliyetleri: Bazı cloud sağlayıcıları egress trafiğini fiyatlandırır. Hızlı transfer daha fazla anlık bant genişliği = daha yüksek peak maliyet riski.

Temel Kullanım

--bwlimit parametresinin temel sözdizimi son derece basit:

rsync --bwlimit=1024 kaynak/ hedef/

Bu komut, transferi maksimum 1024 KB/s (yaklaşık 1 MB/s) ile sınırlar. Parametre değeri her zaman kilobayt/saniye cinsinden girilir.

Birkaç temel örnek:

# 500 KB/s ile yerel dizin yedeklemesi
rsync -av --bwlimit=500 /var/www/html/ /mnt/backup/www/

# 2 MB/s ile uzak sunucuya SSH üzerinden transfer
rsync -avz --bwlimit=2048 /home/kullanici/ [email protected]:/backup/home/

# 10 MB/s ile yerel ağda büyük dosya transferi
rsync -av --progress --bwlimit=10240 /data/büyük-veri/ /mnt/nas/backup/

rsync 3.1.0 ve sonrasında --bwlimit için m (megabyte) ve k (kilobyte) suffix de kullanılabilir:

# 5 MB/s - yeni syntax
rsync -av --bwlimit=5m /kaynak/ /hedef/

# 500 KB/s - yeni syntax
rsync -av --bwlimit=500k /kaynak/ /hedef/

Eski sistemlerde her zaman saf sayısal değer (KB/s) kullanmak daha güvenli.

Gerçek Dünya Senaryosu 1: Mesai Saati ve Mesai Dışı Yedekleme

En yaygın kullanım senaryolarından biri, mesai saatlerinde düşük öncelikli, gece ise tam hızlı yedekleme yapmak. Bunun için cron ile iki farklı görev tanımlanabilir:

# crontab -e ile düzenle

# Mesai saatleri: Pazartesi-Cuma 08:00-18:00, max 512 KB/s
0 8 * * 1-5 rsync -az --bwlimit=512 --delete /var/www/ [email protected]:/backup/www/

# Gece yedekleme: Her gece 02:00, limit yok
0 2 * * * rsync -az --delete /var/www/ [email protected]:/backup/www/

# Mesai saatleri arası artımlı yedek: Her saat başı, düşük bant genişliği
0 9-17 * * 1-5 rsync -az --bwlimit=256 --delete /etc/ [email protected]:/backup/etc/

Bu yaklaşım basit ama etkili. Kullanıcılar günlük işleri yaparken yedekleme arka planda sessizce çalışır.

Gerçek Dünya Senaryosu 2: Dinamik Bant Genişliği Hesaplama

Sabit bir limit yerine mevcut bant genişliğinin belirli bir yüzdesini kullanmak daha akıllıca bir yaklaşım. Aşağıdaki script, sisteme tanımlı bant genişliğinin %30’unu yedeklemeye ayırır:

#!/bin/bash
# /usr/local/bin/smart-backup.sh

# Toplam upload bant genişliği (KB/s cinsinden) - örneğin 100 Mbps = 12500 KB/s
TOTAL_BW=12500

# Mesai saatinde %20, gece %80 kullan
HOUR=$(date +%H)

if [ "$HOUR" -ge 8 ] && [ "$HOUR" -lt 18 ]; then
    # Mesai saati - %20
    BW_LIMIT=$((TOTAL_BW * 20 / 100))
    echo "Mesai saati modu: ${BW_LIMIT} KB/s"
else
    # Gece modu - %80
    BW_LIMIT=$((TOTAL_BW * 80 / 100))
    echo "Gece modu: ${BW_LIMIT} KB/s"
fi

# Log dosyası
LOG="/var/log/backup/rsync-$(date +%Y%m%d).log"
mkdir -p /var/log/backup

rsync -avz 
    --bwlimit=${BW_LIMIT} 
    --delete 
    --log-file="${LOG}" 
    --exclude='*.tmp' 
    --exclude='*.log' 
    /var/www/html/ 
    [email protected]:/backup/production/www/

EXIT_CODE=$?

if [ $EXIT_CODE -eq 0 ]; then
    echo "$(date): Yedekleme basarili - ${BW_LIMIT} KB/s ile tamamlandi" >> /var/log/backup/summary.log
else
    echo "$(date): Yedekleme HATALI - Exit code: ${EXIT_CODE}" >> /var/log/backup/summary.log
fi

Bu script’i cron’a ekleyin:

# Her saat çalıştır, script kendisi limit hesaplar
0 * * * * /usr/local/bin/smart-backup.sh

–bwlimit ile Birlikte Kullanılan Faydalı Parametreler

--bwlimit tek başına kullanıldığında yeterli, ancak diğer rsync parametreleriyle kombinlenince çok daha güçlü bir yapı elde edilir:

–progress: Transfer sürecini gerçek zamanlı gösterir, bant genişliği kullanımını izlemek için idealdir.

rsync -av --progress --bwlimit=1024 /büyük/dizin/ /hedef/dizin/

–stats: Transfer tamamlandığında detaylı istatistik verir.

-z / –compress: Veriyi sıkıştırarak gönderir. Metin ağırlıklı dosyalarda bant genişliği kullanımını düşürür, ancak CPU yükünü artırır.

–partial: Yarıda kesen transferlerin kaldığı yerden devam etmesini sağlar. --bwlimit ile birlikte kullanıldığında yavaş transferlerde çok değerli.

–checksum: Dosya boyutu/tarih yerine checksum karşılaştırması yapar. Yavaş ama güvenilir.

# Tüm faydalı parametreler bir arada
rsync -avz 
    --bwlimit=2048 
    --progress 
    --stats 
    --partial 
    --delete 
    --checksum 
    /kritik/veri/ 
    backup@uzak-sunucu:/yedek/

Bant Genişliği Hesaplama Rehberi

Doğru limit değerini belirlemek için basit bir hesap:

  • 1 Mbps internet hattı = yaklaşık 125 KB/s
  • 10 Mbps = yaklaşık 1250 KB/s
  • 100 Mbps = yaklaşık 12500 KB/s
  • 1 Gbps = yaklaşık 125000 KB/s

Pratik yaklaşım önerileri:

  • Mesai saati, paylaşımlı hat: Toplam bant genişliğinin %10-20’si
  • Mesai dışı, paylaşımlı hat: %60-80’i
  • Dedicated yedekleme hattı: %80-90’ı (biraz tolerans bırakın)
  • VoIP ile paylaşımlı hat: VoIP codec başına 80-100 Kbps ayırın, kalanını kullanın

Örnek hesap: 50 Mbps upload hattı, 20 IP telefonunuz var. Her VoIP çağrısı için 100 Kbps ayırırsanız: 20 x 100 Kbps = 2000 Kbps = 2 Mbps. Kalan 48 Mbps’in %50’sini rsync’e verebilirsiniz: --bwlimit=3000 (yaklaşık 24 Mbps).

Gelişmiş Senaryo: Çoklu Sunucu Yedekleme Scripti

Birden fazla sunucuyu yedeklerken toplam bant genişliğini paralel işlemler arasında paylaştırmak önemli:

#!/bin/bash
# /usr/local/bin/multi-server-backup.sh
# Birden fazla sunucuyu sıralı olarak yedekler, toplam bant genişliğini kontrol altında tutar

BACKUP_DEST="/mnt/backup-nas"
LOG_DIR="/var/log/backup"
DATE=$(date +%Y-%m-%d)
SSH_KEY="/root/.ssh/backup_rsa"

# Gece mi mesai mi?
HOUR=$(date +%H)
if [ "$HOUR" -ge 22 ] || [ "$HOUR" -lt 6 ]; then
    BW_LIMIT=5120   # Gece: 5 MB/s
else
    BW_LIMIT=512    # Gündüz: 512 KB/s
fi

echo "$(date): Yedekleme basladi, limit: ${BW_LIMIT} KB/s" | tee -a "${LOG_DIR}/multi-backup.log"

# Yedeklenecek sunucular: "kullanici@ip:/kaynak:hedef_adi" formatında
SERVERS=(
    "[email protected]:/var/www/:webserver1"
    "[email protected]:/var/www/:webserver2"
    "[email protected]:/var/lib/mysql/:db-server"
    "[email protected]:/etc/:config-server"
)

for SERVER_DEF in "${SERVERS[@]}"; do
    USER_HOST=$(echo "$SERVER_DEF" | cut -d: -f1,2)
    SOURCE_PATH=$(echo "$SERVER_DEF" | cut -d: -f2)
    DEST_NAME=$(echo "$SERVER_DEF" | cut -d: -f3)

    DEST_DIR="${BACKUP_DEST}/${DEST_NAME}/${DATE}/"
    mkdir -p "$DEST_DIR"

    echo "$(date): ${USER_HOST}${SOURCE_PATH} yedekleniyor..." | tee -a "${LOG_DIR}/multi-backup.log"

    rsync -az 
        --bwlimit=${BW_LIMIT} 
        --delete 
        --partial 
        -e "ssh -i ${SSH_KEY} -o StrictHostKeyChecking=no" 
        "${USER_HOST}:${SOURCE_PATH}" 
        "${DEST_DIR}" 
        >> "${LOG_DIR}/${DEST_NAME}-${DATE}.log" 2>&1

    if [ $? -eq 0 ]; then
        echo "$(date): ${DEST_NAME} - BASARILI" | tee -a "${LOG_DIR}/multi-backup.log"
    else
        echo "$(date): ${DEST_NAME} - HATA! Log: ${LOG_DIR}/${DEST_NAME}-${DATE}.log" | tee -a "${LOG_DIR}/multi-backup.log"
    fi
done

echo "$(date): Tum yedeklemeler tamamlandi" | tee -a "${LOG_DIR}/multi-backup.log"

–bwlimit ile Transfer Hızını İzlemek

Yedekleme çalışırken gerçekten belirlediğiniz limitte mi çalışıyor, bunu doğrulamak için birkaç yöntem:

# iftop ile ağ arayüzünü izle (eth0 yerine kendi arayüzünüzü yazın)
iftop -i eth0

# nethogs ile process bazlı bant genişliği izleme
nethogs eth0

# rsync'in kendisinin --progress çıktısı
rsync -av --progress --bwlimit=1024 /büyük/dosya.tar.gz backup@sunucu:/backup/
# Çıktı örneği:
# büyük-dosya.tar.gz
#   1,048,576,000 100%    987.45kB/s    0:16:43 (xfr#1, to-chk=0/1)

--progress çıktısındaki hız değeri yaklaşık olarak --bwlimit değerinize yakın olmalı. Tam olarak eşleşmeyebilir, rsync ortalamayı gösterir.

Sorun Giderme

“Limit hiç çalışmıyor gibi, hala çok hızlı”

rsync --bwlimit değeri, her transfer edilen dosya için ayrı ayrı uygulanır. Çok sayıda küçük dosya transferinde ölçüm yanıltıcı görünebilir. Gerçek ağ trafiğini iftop veya nethogs ile doğrulayın.

“Değer KB/s mi MB/s mi?”

Yeni rsync sürümlerinde suffix kullanabilseniz de, eski sistemlerle uyumluluk için her zaman KB/s olarak girmeyi tercih edin. --bwlimit=1024 = 1 MB/s.

“SSH tünelinde limit düzgün çalışmıyor”

SSH sıkıştırması (-C ya da Compression yes) aktifse, gerçek ağ trafiği rsync’in gördüğünden farklı olabilir. SSH üzerinden rsync kullanıyorsanız SSH sıkıştırmasını kapatın, sadece rsync’in -z parametresini kullanın.

# SSH sıkıştırması kapalı, sadece rsync sıkıştırması
rsync -az --bwlimit=2048 -e "ssh -o Compression=no" /kaynak/ user@hedef:/yedek/

“Script çalışıyor ama log’da bwlimit göremiyorum”

rsync --log-file çıktısı bwlimit’i log’a yazmaz. Transfer istatistiklerini görmek için --stats parametresini ekleyin, bu toplam veri miktarını ve süreyi gösterir, oradan ortalama hızı hesaplayabilirsiniz.

systemd Timer ile Daha Modern Bir Yaklaşım

Cron yerine systemd timer kullanıyorsanız, bwlimit’i de dahil eden eksiksiz bir service/timer çifti şöyle görünür:

# /etc/systemd/system/rsync-backup.service
[Unit]
Description=Rsync Yedekleme Servisi
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
User=root
ExecStart=/usr/local/bin/smart-backup.sh
StandardOutput=journal
StandardError=journal
# Servisin CPU önceliğini düşür
Nice=10
# I/O önceliğini de düşür
IOSchedulingClass=best-effort
IOSchedulingPriority=7
# /etc/systemd/system/rsync-backup.timer
[Unit]
Description=Rsync Yedekleme Zamanlayici
Requires=rsync-backup.service

[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true

[Install]
WantedBy=timers.target

Servisi etkinleştirme:

systemctl daemon-reload
systemctl enable --now rsync-backup.timer
systemctl list-timers rsync-backup.timer

Nice=10 ve IOSchedulingPriority=7 kombinasyonu, --bwlimit ile birlikte kullanıldığında hem ağ hem CPU hem de disk I/O açısından minimal etki yaratan bir yedekleme süreci oluşturur.

Pratik Öneriler ve Dikkat Edilecekler

  • Her zaman test edin: Yeni bir ortamda --bwlimit ayarlarken küçük bir test transferi yapın ve iftop ile gerçek kullanımı doğrulayın.
  • Limit sıfırsa sınır yok: --bwlimit=0 koymak limiti devre dışı bırakır, tam hız transfer demektir.
  • rsync sürümünü kontrol edin: rsync --version ile sürümü görün. 3.1.0 öncesi sürümlerde m/k suffix çalışmaz.
  • NFS ve CIFS mount’larında dikkat: Uzak dosya sistemlerine yazarken --bwlimit sadece rsync okuma hızını sınırlar. NFS mount’un kendisinin bant genişliği ayrıca değerlendirin.
  • Log’ları düzenli inceleyin: Bant genişliği limiti nedeniyle yedekleme penceresine sığmayan işler var mı? Log analizi ile limit değerini optimize edin.
  • Paralel rsync çalıştırmayın: İki rsync process aynı anda çalışıyorsa her biri kendi limitinde çalışır, toplam ikiye katlanır. Multi-server script gibi sıralı çalışan yapılar tercih edin.

Sonuç

--bwlimit, rsync’in en kullanışlı ama en çok göz ardı edilen parametrelerinden biri. Üretim ortamlarında yedekleme ve kullanıcı deneyimi arasında denge kurmanın en kolay yolu bu parametre. Sabit bir değer atayıp geçebilirsiniz, ya da smart-backup.sh gibi dinamik bir yaklaşımla mesai/gece ayrımı yapabilirsiniz.

Önemli olan şu: Yedekleme sisteminiz ne kadar şeffaf ve sessiz çalışırsa, o kadar uzun süre sorunsuz çalışır. Kullanıcıların fark etmediği bir yedekleme altyapısı, en iyi yedekleme altyapısıdır. --bwlimit de tam olarak bu “görünmezliği” sağlayan araç.

Bir sonraki adım olarak bu scriptleri gerçek ortamınıza uyarlayın, bir hafta boyunca log’ları takip edin ve limit değerlerini gerçek kullanım verilerine göre ayarlayın. Sabah geldiğinizde yedekler tamamlanmış, kullanıcılar mutlu, siz de rahat olacaksınız.

Bir yanıt yazın

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