TC QDISC ve iperf'i anlama


15

Bant genişliğini sınırlamaya tcve sonuçları kontrol etmeye çalışıyorum iperf. Ben şöyle başladım:

# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[  3] local 192.168.2.7 port 35213 connected with 192.168.2.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec   830 MBytes   696 Mbits/sec

İki örnek doğrudan Ethernet üzerinden bağlanır.

Daha sonra htb qdiscbant genişliğini 1mbit / sn ile sınırlamak için bir varsayılan sınıf ile ayarladım :

# tc qdisc add dev bond0 root handle 1: htb default 12
# tc class add dev bond0 parent 1: classid 1:12 htb rate 1mbit

Ama beklediğim şeyi elde edemiyorum:

# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[  3] local 192.168.2.7 port 35217 connected with 192.168.2.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-12.8 sec   768 KBytes   491 Kbits/sec

Hızı iki katına çıkarsam, ölçülen bant genişliği değişmez. Neyi kaçırıyorum? Ölçülen bant genişliği neden rateparametreden 1 mbit'e karşılık gelmiyor ? Bant genişliğini belirli bir hızla sınırlamak için hangi parametreleri ayarlamam gerekir?

Ancak mansayfa bunun bu görev için tercih tbfedilmesi gerektiğini söylüyor qdisc:

Token Kovası Filtresi, trafiği hassas bir şekilde yapılandırılmış bir hıza yavaşlatmak için uygundur. Büyük bant genişliklerine göre iyi ölçeklendirilir.

tbfparametreleri gerektirir rate, burstve ( limit| latency). Bu yüzden kullanılabilir bant genişliğini nasıl burstve ( limit| latency) etkilediğini anlamadan aşağıdakileri denedim :

# tc qdisc add dev bond0 root tbf rate 1mbit limit 10k burst 10k

Bu bana 113 Kbit / sn'lik bir bant genişliği verdi. Bu parametrelerle oynamak, bir mtuşeyleri büyük ölçüde değiştirdiğini fark edene kadar çok fazla değişmedi :

# tc qdisc add dev bond0 root tbf rate 1mbit limit 10k burst 10k mtu 5000

1,00 Mbits / sn'lik bir bant genişliği ile sonuçlandı.

Bant genişliğini belirli bir hızla sınırlamak için hangi parametreleri ayarlamam gerekir?

Bunun için htbveya tbfkuyruk disiplini kullanmalı mıyım ?

DÜZENLE :

Bu kaynaklara dayanarak bazı testler yaptım:

Aşağıdaki kurulumları denedim.

Fiziksel Makinede

/etc/network/interfaces:

auto lo
iface lo inet loopback

auto br0
iface br0 inet dhcp
bridge_ports eth0

İle ölçüm iperf:

# tc qdisc add dev eth0 root handle 1: htb default 12
# tc class add dev eth0 parent 1: classid 1:12 htb rate 1mbit
# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[  3] local 192.168.2.4 port 51804 connected with 192.168.2.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-11.9 sec  1.62 MBytes  1.14 Mbits/sec

Oysa iperfsunucunun farklı bir bant genişliği hesaplanır:

[  4] local 192.168.2.1 port 5001 connected with 192.168.2.4 port 51804
[  4]  0.0-13.7 sec  1.62 MBytes   993 Kbits/sec

Yapışmasız Sanal Makinede

/etc/network/interfaces:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

İle ölçüm iperf:

# tc qdisc add dev eth0 root handle 1: htb default 12
# tc class add dev eth0 parent 1: classid 1:12 htb rate 1mbit
# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[  3] local 192.168.2.7 port 34347 connected with 192.168.2.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-11.3 sec  1.62 MBytes  1.21 Mbits/sec

Oysa iperfsunucunun farklı bir bant genişliği hesaplanır:

[  4] local 192.168.2.1 port 5001 connected with 192.168.2.7 port 34347
[  4]  0.0-14.0 sec  1.62 MBytes   972 Kbits/sec

Yapıştırma ile Sanal Makinede (tc eth0 üzerinde yapılandırılmıştır)

/etc/network/interfaces:

auto lo
iface lo inet loopback

auto eth0
allow-bond0 eth0
iface eth0 inet manual
    bond-master bond0
    bond-primary eth0 eth1

auto eth1
allow-bond0 eth1
iface eth1 inet manual
    bond-master bond0
    bond-primary eth0 eth1

auto bond0
iface bond0 inet dhcp
    bond-slaves none
    bond-mode 1
#    bond-arp-interval 250
#    bond-arp-ip-target 192.168.2.1
#    bond-arp-validate 3

İle ölçüm iperf:

# tc qdisc add dev eth0 root handle 1: htb default 12
# tc class add dev eth0 parent 1: classid 1:12 htb rate 1mbit
# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[  3] local 192.168.2.9 port 49054 connected with 192.168.2.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-11.9 sec  1.62 MBytes  1.14 Mbits/sec

Oysa iperfsunucunun farklı bir bant genişliği hesaplanır:

[  4] local 192.168.2.1 port 5001 connected with 192.168.2.9 port 49054
[  4]  0.0-14.0 sec  1.62 MBytes   972 Kbits/sec

Yapıştırma ile Sanal Makinede (bond0 üzerinde yapılandırılmış tc)

/etc/network/interfaces:

auto lo
iface lo inet loopback

auto eth0
allow-bond0 eth0
iface eth0 inet manual
    bond-master bond0
    bond-primary eth0 eth1

auto eth1
allow-bond0 eth1
iface eth1 inet manual
    bond-master bond0
    bond-primary eth0 eth1

auto bond0
iface bond0 inet dhcp
    bond-slaves none
    bond-mode 1
#    bond-arp-interval 250
#    bond-arp-ip-target 192.168.2.1
#    bond-arp-validate 3

İle ölçüm iperf:

# tc qdisc add dev bond0 root handle 1: htb default 12
# tc class add dev bond0 parent 1: classid 1:12 htb rate 1mbit
# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[  3] local 192.168.2.9 port 49055 connected with 192.168.2.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-13.3 sec   768 KBytes   475 Kbits/sec

Oysa iperfsunucunun farklı bir bant genişliği hesaplanır:

[  4] local 192.168.2.1 port 5001 connected with 192.168.2.9 port 49055
[  4]  0.0-14.1 sec   768 KBytes   446 Kbits/sec

Bağdan eth1(pasif arayüz) çıkarırsam sonuç değişmez .

Sonuç

Bir bağ arabirimindeki Trafik Denetimi çalışmıyor veya en azından beklendiği gibi çalışmıyor. Daha fazla araştırmam gerekecek.

Çözüm olarak kuyruk disiplinleri doğrudan tahvile ait arayüzlere eklenebilir .


Garip bir şekilde, bu şu adam için işe yaramış gibi görünüyor: blog.tinola.com/?e=22
Matías E. Fernández

1
Ben htb ile, tc filterpaketleri sınıflara koymak için kullanmak zorunda düşünüyorum . Bazı htb parametrelerini de değiştirmeniz gerekebilir (tıpkı tbf gibi ayarlayın). Ben tcngtc için bir ön uç olan, bakmak öneririz . (Bunlar hızlı işaretçiler ...)
derobert

Yayınınızda herhangi bir filtre görmedim. Hız sınırlaması için trafiği eşleştirmek için hangi komutları kullanıyorsunuz?

Yanıtlar:


2

Tc'nin nasıl çalıştığından emin değilseniz, yine de tc'yi izleyebilir ve paketlerin nasıl aktığını görebilirsiniz? Komutumu tc'yi izlemek için kullanabilir ve ayrıcalık kaldırılmış bir terminalde çalıştırmanız gerekir. Wlan0'ı başka bir arayüzle değiştirebilirsiniz ve ayrıca grep ve awk'ye ihtiyacınız vardır:

      #!/bin/sh
      INTERVAL=15
      while sleep $INTERVAL
      do
             /usr/sbin/tc -s -d class show dev wlan0

             uptime
             more /proc/meminfo | grep MemFree | grep -v grep
             echo cache-name num-active-objs total-objs obj-size
             SKBUFF=`more /proc/slabinfo | grep skbuff | grep -v grep | awk 
             '{print $2} {print $3} {print $4}'`

             echo skbuff_head_cache: $SKBUFF
      done

0

burst/ limitDeğerlerini artırmayı deneyin . Belirteç kepçe algoritmalar iyi ölçek, ancak sınırlı bir hassasiyet / hız oranına sahiptir.

Doğruluk, küçük bir kova kullanılarak elde edilir, belirteçlerin boyutunu artırarak hız. Büyük jetonlar, yeniden doldurulma hızının azaldığı anlamına gelir (saniye başına simge = saniye başına bayt / simge başına bayt).

rateParametre verir ortalama , aşılması gereken bir oranını burstveya limitparametreler ortalama penceresinin boyutunu verir. Hat hızında bir paket göndermek, paketin aktarıldığı zaman için ayarlanan hızı aştığından, ortalama penceresinin, tek bir paket göndermenin tüm pencereyi sınırın üzerine itmeyecek kadar büyük olması gerekir; pencereye daha fazla paket sığarsa, algoritma hedefe tam olarak vurma şansı daha yüksektir.


0

bağlama arabirimine kuyruk disiplini eklemeden önce bunu çalıştırın (bu durumda bond0)

ipconfig bond0 txqueuelen 1000

bağlanma arabirimi gibi yazılım sanal aygıtının varsayılan kuyruğu olmadığından çalışmaz.


0

Yana bondcihazlar ayarı, kuyruğunu tanımladıktan gelmez qdiscboyutu açıkça benim için sorunu giderir.

Yapının qdiscaltında kullanılacak bir yaprak örneği HTB: tc qdisc add dev $dev parent $parent handle $handle pfifo limit 1000

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.