Bir uygulamanın performansını ölçmek için Linux için UDP
ve TCP
üzerinde paket gecikmesini ve kaybını simüle etmek istiyorum . Bunu yapmanın kolay bir yolu var mı?
Bir uygulamanın performansını ölçmek için Linux için UDP
ve TCP
üzerinde paket gecikmesini ve kaybını simüle etmek istiyorum . Bunu yapmanın kolay bir yolu var mı?
Yanıtlar:
netem, ağları simüle etmek için halihazırda Linux ve kullanıcı alanı yardımcı programlarında yerleşik olan işlevselliği kullanır. Aslında Mark'ın cevabı farklı bir adla ifade ediyor.
Ana sayfalarındaki örnekler zaten istediğinizi nasıl başarabileceğinizi gösteriyor:
Örnekler
Geniş alan ağı gecikmelerini taklit etme
Bu en basit örnektir, yerel Ethernet'ten çıkan tüm paketlere sabit miktarda gecikme ekler.
# tc qdisc add dev eth0 root netem delay 100ms
Şimdi yerel ağda barındırmak için basit bir ping testi 100 milisaniyelik bir artış göstermelidir. Gecikme çekirdeğin saat çözünürlüğü (Hz) ile sınırlıdır. Çoğu 2.4 sistemde, sistem saati 100 Hz'de çalışır ve bu da 10 ms'lik artışlarla gecikmelere izin verir. 2.6'da, değer 1000 ila 100 Hz arasındaki bir yapılandırma parametresidir.
Sonraki örnekler sadece qdisc'i yeniden yüklemeden parametreleri değiştirir
Gerçek geniş alan ağları değişkenlik gösterir, bu nedenle rasgele varyasyon eklemek mümkündür.
# tc qdisc change dev eth0 root netem delay 100ms 10ms
Bu, eklenen gecikmenin 100 ± 10 ms olmasına neden olur. Ağ gecikmesi değişimi tamamen rastgele değildir, bu nedenle bir korelasyon değerinin de olduğunu taklit etmek için.
# tc qdisc change dev eth0 root netem delay 100ms 10ms 25%
Bu, eklenen gecikmenin 100 ± 10 ms olmasına neden olur ve bir sonraki rastgele eleman sonuncusunda% 25'e bağlıdır. Bu gerçek istatistiksel korelasyon değil, bir yaklaşımdır.
Gecikme dağılımı
Tipik olarak, bir ağdaki gecikme aynı değildir. Gecikmedeki değişimi tanımlamak için normal dağılım gibi bir şey kullanmak daha yaygındır. Netem disiplini, eşit olmayan bir dağılım belirlemek için bir tablo alabilir.
# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal
Gerçek tablolar (normal, pareto, paretonormal) iproute2 derlemesinin bir parçası olarak oluşturulur ve / usr / lib / tc içine yerleştirilir; bu nedenle deneysel verilere dayalı olarak kendi dağıtımınızı yapmak için biraz çaba harcamanız mümkündür.
Paket kaybı
Rastgele paket kaybı yüzde olarak 'tc' komutunda belirtilir. Olası en küçük sıfır olmayan değer:
2 −32 =% 0.0000000232
# tc qdisc change dev eth0 root netem loss 0.1%
Bu, yüzde (1/1000) paketin 1 / 10'unun rastgele düşmesine neden olur.
İsteğe bağlı bir korelasyon da eklenebilir. Bu, rasgele sayı üretecinin daha az rasgele olmasına neden olur ve paket patlama kayıplarını taklit etmek için kullanılabilir.
# tc qdisc change dev eth0 root netem loss 0.3% 25%
Bu, paketlerin% 0,3'ünün kaybolmasına neden olur ve her ardışık olasılık, sonuncusuna çeyrek bağlıdır.
Prob n = 0.25 × Prob n-1 + 0.75 × Rastgele
tc qdisc add
Bu arabirim için kuralınız tc qdisc change
yoksa veya bu arabirim için zaten kurallarınız varsa kullanmanız gerektiğini unutmayın . tc qdisc change
Kural içermeyen bir arayüzde kullanılmaya çalışmak hata verir RTNETLINK answers: No such file or directory
.
tc -p qdisc ls dev eth0
akım tanımlanmış kurallar listesi, ve tc qdisc del dev eth0 root
bunları silecektir
Bırakılan paketler için iptables ve istatistik modülünü kullanırım .
iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP
Yukarıda% 1 olasılıkla gelen bir paket düşecektir. Dikkatli olun, yaklaşık 0.14'ün üzerindeki herhangi bir şey ve çoğunuz tcp bağlantıları büyük olasılıkla tamamen durur.
Adam iptables bir göz atın ve daha fazla bilgi için "istatistik" arayın.
DROP
üzerinde giden bağlantıları oldukça gülünç neden send()
dönüş operasyonlarını EPERM
ziyade sadece (olması gerektiği gibi) paketleri bırakarak,.
iptables -D INPUT -m statistic --mode random --probability 0.01 -j DROP
Meslektaşlarımdan biri bunu yapmak için tc kullanıyor. Daha fazla bilgi için kılavuz sayfasına bakınız. Kullanımının bir örneğini burada görebilirsiniz .
Ağ fizik simülasyonları hakkındaki bu öğretici, UDP bağlantısında gecikme ve paket kaybını simüle etmek için örnek kodunda bir C ++ sınıfı içerir ve yol gösterici olabilir. İndirilebilir kaynak kodunun Connection.h dosyasında bulunan Connection sınıfının genel gecikme ve packetLoss değişkenlerine bakın .
Kendim denemedim, ancak bu sayfada Linux'un yerleşik iptables IP filtreleme sisteminde çalışan eklenti modüllerinin bir listesi var. Modüllerden birine "n." Denir ve paketlerin yapılandırılabilir bir oranını düşürecek bir kural belirlemenize izin verir. En azından başlamak için iyi bir yer olabilir.
Http://snad.ncsl.nist.gov/nistnet/ deneyebilirsiniz Oldukça eski bir NIST projesi (son sürüm 2005), ama benim için çalışıyor.
Kullanımı kolay bir ağ hatası enjeksiyon aracı Saboteur'dur . Simüle edebilir:
- Toplam ağ bölümü
- Uzaktan servis öldü (beklenen bağlantı noktasını dinlemiyor)
- gecikmeler
- Paket kaybı -TCP bağlantısı zaman aşımı (iki sistem durum bilgisi olan bir güvenlik duvarı ile ayrıldığında sıklıkla görülür)
Bilim camiasında bu amaçla en çok kullanılan araçlardan biri DummyNet'tir . Eğer yükledikten sonra ipfw
2 makineler arasında 50ms yayılma gecikmesi tanıtmak amacıyla, çekirdek modülü sadece bu komutları çalıştırın:
./ipfw pipe 1 config delay 50ms
./ipfw add 1000 pipe 1 ip from $IP_MACHINE_1 to $IP_MACHINE_2
Ayrıca paket kayıplarının% 50'sini sunmak için:
./ipfw pipe 1 config plr 0.5
İşte daha fazla ayrıntı.