İki ubuntu sunucu makinesi arasında yavaş bağlantı simülasyonu


9

Aşağıdaki senaryoyu simüle etmek istiyorum: A, B, C ve D olmak üzere 4 ubuntu sunucu makineme sahip olduğum göz önüne alındığında, ağ bant genişliğini makine A ile makine C arasında% 20 ve A ile B arasında% 10 azaltmak istiyorum. ağ simülasyon / daraltma araçlarını kullanarak bunu yapmak?


iptables kısma yeteneğine sahip olabilir. Hiç kullanmadım, ama bakmaya değer.
Michael Martinez

@MichaelMartinez Hayır değil. tciptables işareti ile kullanıldığında yapar.
Xavier Lucas

@XavierLucas bilmek güzel!
Michael Martinez

Yanıtlar:


15

Bunu yapmak için filtrelerle tctek başına u32veya iptables işaretlemesiyle birlikte kullanabilirsiniz (karmaşık filtreler sözdizimini öğrenmek istemiyorsanız belki daha kolay olabilir). Aşağıdaki yazıda eski çözümü ayrıntılı olarak açıklayacağım.


Kurulumunuzu simüle etme

Örnek olarak, 10 Mbit / s sanal arabirim çalıştıran A, B, C ve D'yi ele alalım .

Temel olarak:

  • A <==> B: 9 Çıkış için 9 Mbit / s şekillendirme
  • A <==> C: Çıkış için 8 Mbit / s şekillendirme

Bunu simüle etmek için bir köprüye takılmış 4 ağ ad alanı ve sanal ethernet arayüzü oluşturacağım.

Tabii ki, sizin durumunuzda gerçek NIC'lerle çalışacaksınız ve köprü, altyapınıza bağlı olarak ağ geçidiniz veya bir anahtar olacaktır.

Simülasyonumda 10.0.0.0/24 ağında aşağıdaki kurulum gerçekleştirilecek:

                                  10.0.0.254            

                                  +-------+                     
                                  |       |                     
                                  |  br0  |                     
                                  |       |                   
                                  +---+---+                     
                                      |                         
                                      | veth{A..D}.peer        
                                      |                      
                  +------------+------+-----+------------+     
                  |            |            |            |      
            vethA |      vethB |      vethC |      vethD |      
              +---+---+    +---+---+    +---+---+    +---+---+  
              |       |    |       |    |       |    |       |   
              |   A   |    |   B   |    |   C   |    |   D   |   
              |       |    |       |    |       |    |       |  
              +-------+    +-------+    +-------+    +-------+    

              10.0.0.1      10.0.0.2     10.0.0.3     10.0.0.4           

İlk olarak, kurulum phasis'i, ne yapıldığını anlayabilmeniz için, aşina değilseniz atlayın, önemli değil. Bununla birlikte bilmeniz gerekenler, komutun ip netns exec <namespace> <command>bir ağ ad alanında (yani önceki çizimin kutusundan birinde) bir komutun yürütülmesine izin verdiğidir. Bu, bir sonraki bölümde de kullanılacaktır.

# Create the bridge
ip link add br0 type bridge

# Create network namespaces and veth interfaces and plug them into the bridge
for host in {A..D} ; do 
    ip link netns add ${host}
    ip link add veth${host} type veth peer name veth${host}.peer
    ip link set dev veth${host}.peer master br0
    ip link set dev veth${host} netns ${host}
    ip netns exec ${host} ip link set veth${host} up
done

# Assign IPs
ip addr add 10.0.0.254/24 dev br0
ip netns exec A ip addr add 10.0.0.1/24 dev vethA
ip netns exec B ip addr add 10.0.0.2/24 dev vethB
ip netns exec C ip addr add 10.0.0.3/24 dev vethC
ip netns exec D ip addr add 10.0.0.4/24 dev vethD

Bu noktada, daha önce açıklanan düzene sahibiz.


Trafiği şekillendirme

İstediğinizi elde etmek için trafik kontrolüne geçme zamanı. tcAracı kuyruk disiplinlerini eklemenizi sağlar:

  • Çıkış için: çekirdeğin paket göndermesi gerektiğinde ve NIC sürücüsüne erişmeden önce.
  • Giriş için: NIC sürücüsüne eriştikten sonra ve çekirdek rutinleri alınan paketler üzerinde çalıştırılmadan önce.

3 kavram ile gelir: qdisc , sınıflar ve filtreler . Bu kavramlar, karmaşık paket akış yönetimini ayarlamak ve trafiği istediğiniz ölçüt / ölçütlere göre önceliklendirmek için kullanılabilir.

Kısaca :

  • Qdisk'ler, paketlerin yaratıcı bir şekilde sıralanacağı / ayıklandığı yapılar.
  • Sınıflar, belirli davranışlarla hareket eden qdisk'ler için kaplardır.
  • Filtreler paketleri sınıflar arasında yönlendirmenin bir yoludur, bunların birçoğu aynı giriş noktasında işleme sırasında önceliklerle tanımlanabilir.

Tüm bunlar genellikle yaprakların qdiscs ve sınıfların düğüm olduğu bir ağaç olarak çalışır. Bir ağacın veya alt ağacın kökü olarak <id>:ve alt düğümleri olarak bildirilir <parent_id>:<children_id>. Bu sözdizimini unutmayın.

Sizin durumunuz için, A'yı alalım ve kurmak istediğiniz ağacı oluşturalım tc:

                                     1:
                                      |
                                      |
                                      |
                                     1:1
                                   /  |  \
                                  /   |   \
                                 /    |    \
                               1:10  1:20  1:30
                                |     |     |
                                |     |     |
                               :10   :20   :30

Açıklama:

  • 1:vethA aygıtına bağlı kök qdisc ise, htbHiyerarşi Jetonu Kovası'nda olduğu gibi açık bir şekilde alınacaktır (bir cihazın varsayılan qdisc'i pfifoveya pfifo_fastişletim sistemine bağlı olarak). Bant genişliği yönetimi için özellikle uygundur. Bu düzeyde tanımlanan filtrelerle eşleşmeyen paketler 1:30sınıfa gider .
  • 1:1htbcihazın tüm trafiğini 10 Mbit / s ile sınırlayan bir sınıf olacaktır .
  • 1:10htbçıkış trafiğini 9 Mbit / s ile sınırlayan bir sınıf olacaktır (10 Mbit / s'nin% 90'ı).
  • 1:20htbçıkış trafiğini 8 Mbit / s ile sınırlayan bir sınıf olacaktır (10 Mbit / s'nin% 80'i).
  • 1:30htbtrafiği 10 Mbit / s ile sınırlayan bir sınıf olacaktır (yedek).
  • :10, :20, :30Hangi sfqStokastik Adil Queuing için qdisc. Başka bir deyişle, bu qdisk'ler akışlara dayalı iletim zamanlamasında adaleti sağlayacaktır.

Tüm bunlar aşağıdaki komutlarla ayarlanır:

ip netns exec A tc qdisc add dev vethA root handle 1: htb default 30
ip netns exec A tc class add dev vethA parent 1: classid 1:1 htb rate 10mbit burst 15k
ip netns exec A tc class add dev vethA parent 1:1 classid 1:10 htb rate 9mbit burst 15k
ip netns exec A tc class add dev vethA parent 1:1 classid 1:20 htb rate 8mbit burst 15k
ip netns exec A tc class add dev vethA parent 1:1 classid 1:30 htb rate 10mbit burst 15k
ip netns exec A tc qdsic add dev vethA parent 1:10 handle 10: sfq perturb 10
ip netns exec A tc qdisc add dev vethA parent 1:20 handle 20: sfq perturb 10
ip netns exec A tc qdisc add dev vethA parent 1:30 handle 30: sfq perturb 10

İhtiyacımız olan son şey, hedef IP eşit B'ye 1:10sahip IP paketlerinin sınıfa ve hedef IP eşit C'ye sahip IP paketlerinin sınıfa gitmesi için filtreler eklemektir 1:20:

ip netns exec A tc filter add dev vethA parent 1: protocol ip prio 1 u32 match ip dst 10.0.0.2/32 flowid 1:10
ip netns exec A tc filter add dev vethA parent 1: protocol ip prio 2 u32 match ip dst 10.0.0.3/32 flowid 1:20

Şimdi fikri anladığınıza göre, tcB ve C'ye benzer kurallar eklemeniz gerekecek, böylece bu teçhizatlardan A'ya aktarımlar da şekillenecek.


Test yapmak

Şimdi test edelim. Bunun için ben şahsen oynamak için alışkınım iperf, sadece bir istemci veya sunucu olarak çalıştırılabilen ve her iki ana bilgisayar arasında mümkün olduğunca fazla trafik gönderecek tek bir ikili dosyadan oluşur.

A ve B arasında :

 $ ip netns exec B iperf -s -p 8001
  ...
 $ ip netns exec A iperf -c 10.0.0.2 -p 8001 -t 10 -i 2
------------------------------------------------------------
Client connecting to 10.0.0.2, TCP port 8001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[  5] local 10.0.0.1 port 58191 connected with 10.0.0.2 port 8001
[ ID] Interval       Transfer     Bandwidth
[  5]  0.0- 2.0 sec  2.38 MBytes  9.96 Mbits/sec
[  5]  2.0- 4.0 sec  2.12 MBytes  8.91 Mbits/sec
[  5]  4.0- 6.0 sec  2.00 MBytes  8.39 Mbits/sec
[  5]  6.0- 8.0 sec  2.12 MBytes  8.91 Mbits/sec
[  5]  8.0-10.0 sec  2.00 MBytes  8.39 Mbits/sec
[  5]  0.0-10.1 sec  10.8 MBytes  8.91 Mbits/sec

9 Mbit / s bant genişliği sınırımızı alıyoruz .

A ve C arasında:

$ ip netns exec C iperf -s -p 8001
...
$ ip netns exec A iperf -c 10.0.0.3 -p 8001 -t 10 -i 2
------------------------------------------------------------
Client connecting to 10.0.0.3, TCP port 8001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[  5] local 10.0.0.1 port 58522 connected with 10.0.0.3 port 8001
[ ID] Interval       Transfer     Bandwidth
[  5]  0.0- 2.0 sec  2.25 MBytes  9.44 Mbits/sec
[  5]  2.0- 4.0 sec  1.75 MBytes  7.34 Mbits/sec
[  5]  4.0- 6.0 sec  1.88 MBytes  7.86 Mbits/sec
[  5]  6.0- 8.0 sec  1.88 MBytes  7.86 Mbits/sec
[  5]  8.0-10.0 sec  1.75 MBytes  7.34 Mbits/sec
[  5]  0.0-10.1 sec  9.62 MBytes  7.98 Mbits/sec

8 Mbit / s bant genişliği sınırımızı alıyoruz .

A ve D arasında:

$ ip netns exec D iperf -s -p 8001
...
$ ip netns exec A iperf -c 10.0.0.4 -p 8001 -t 10 -i 2
------------------------------------------------------------
Client connecting to 10.0.0.4, TCP port 8001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[  5] local 10.0.0.1 port 40614 connected with 10.0.0.4 port 8001
[ ID] Interval       Transfer     Bandwidth
[  5]  0.0- 2.0 sec  2.62 MBytes  11.0 Mbits/sec
[  5]  2.0- 4.0 sec  2.25 MBytes  9.44 Mbits/sec
[  5]  4.0- 6.0 sec  2.38 MBytes  9.96 Mbits/sec
[  5]  6.0- 8.0 sec  2.25 MBytes  9.44 Mbits/sec
[  5]  8.0-10.0 sec  2.38 MBytes  9.96 Mbits/sec
[  5]  0.0-10.2 sec  12.0 MBytes  9.89 Mbits/sec

Burada 10 Mbit / s hıza ulaşan sanal arayüze sahibiz .

Her çalışmanın ilk ölçümünün patlamasının htb, yeterli parametre ayarlanarak sınıflarda daha iyi ele alınabileceğini unutmayın .


Temizlemek

Ayırmak :

  • Öncelik 1 filtre 1:: tc filter del dev vethA parent 1: prio 1 u32.
  • Tüm üstünde filtreler 1:: tc filter del dev vethA parent 1:.
  • Sınıf 1:20ve alt öğeleri: tc class del dev vethA parent 1:1 classid 1:20.
  • Bütün ağacı: tc qdisc del dev vethA.

Simülasyon setini temizlemek için:

# Remove veth pairs and network namespaces
for host in {A..D} ; do
    ip link del dev veth${host}.peer
    ip netns del ${host}
done

# Remove the bridge
ip link del dev br0

1
İnanılmaz cevabınız için çok teşekkürler. Mümkünse, filtreleri kaldırmak için lütfen komutları ekleyebilir misiniz? herhangi birinin simülasyondan sonra bu kurulumu güvenli bir şekilde geri almak istemesi durumunda.
Yehia Elshater

1
@YahiaZakaria Bu bilgiyi yazımın ikinci kısmına ekledim.
Xavier Lucas

0

Ubuntu'nun FreeBSD'den taşınan IPFW'si vardır ve IPFW'de çeşitli ağ parametrelerini (bant genişliği, gecikme, paket kaybı oranı vb.) Yönetmeye izin veren DUMMYNET bulunur.


0

En iyisi tc araçlarını şimdi entegre (en azından Ubuntu sunucusunda) netem modülüyle kullanmaktır. Bu makalede Stackoverflow'dan daha fazla bilgi bulabilirsiniz .


Netem bant genişliği ile değil, rtt ve tıkanıklık öykünmesi ile ilgilidir.
Xavier Lucas

1
@XavierLucas, haklısın, bant genişliği için sadece netc olmadan tc'ye ihtiyacınız var.
Luc Stepniewski

0

Damlama iyi çalışıyor.

Bu tartışma bazı sınırlamalar göstermektedir: /unix/109973/how-to-change-speed-limit-of-running-trickle-instance


Damlama, belirli bir program için ağ bant genişliğini simüle etmek için kullanılır. OP ev sahibinin kapsamında bir çözüm arıyor gibi görünüyor.
Xavier Lucas

Trickled, bir grup bağlantıyı simüle etmek için kullanılabilir (sadece tek bir bağlantı değil). Aslında soru "ana bilgisayardan ana bilgisayara tüm bağlantılar" olarak yorumlanabilir.
Mathew
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.