Memahami tc qdisc dan iperf

15

Saya mencoba membatasi bandwidth dengan tcdan memeriksa hasilnya iperf. Saya mulai seperti ini:

# 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

Kedua instance terhubung langsung dengan melalui Ethernet.

Saya kemudian mengatur htb qdiscdengan satu kelas default untuk membatasi bandwidth hingga 1mbit / detik:

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

Tapi saya tidak mendapatkan apa yang saya harapkan:

# 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

Jika saya menggandakan laju, bandwidth yang diukur tidak berubah. Apa yang saya lewatkan? Mengapa bandwidth yang diukur tidak sesuai dengan 1mbit dari rateparameter? Parameter apa yang harus saya atur untuk membatasi bandwidth ke tingkat yang tepat?

Namun, manhalaman tersebut mengatakan bahwa itu tbfharus menjadi qdiscpilihan untuk tugas ini:

Filter Token Bucket cocok untuk memperlambat lalu lintas ke tingkat yang dikonfigurasi dengan tepat. Timbangan baik untuk bandwidth besar.

tbfmembutuhkan parameter rate, burstdan ( limit| latency). Jadi saya mencoba yang berikut tanpa memahami bagaimana burstdan ( limit| latency) memengaruhi bandwidth yang tersedia:

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

Ini memberi saya bandwidth terukur dari 113 Kbits / detik. Bermain-main dengan parameter itu tidak banyak berubah sampai saya perhatikan bahwa menambahkan nilai untuk mtuperubahan terjadi secara drastis:

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

menghasilkan bandwidth yang diukur sebesar 1,00 Mbits / detik.

Parameter apa yang harus saya tetapkan untuk membatasi bandwidth ke tingkat yang tepat?

Haruskah saya menggunakan disiplin antrian htbatau tbfuntuk ini?

EDIT :

Berdasarkan sumber daya ini, saya telah melakukan beberapa tes:

Saya telah mencoba pengaturan berikut.

Pada Mesin Fisik

/etc/network/interfaces:

auto lo
iface lo inet loopback

auto br0
iface br0 inet dhcp
bridge_ports eth0

Pengukuran dengan 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

Sedangkan iperfserver menghitung bandwidth yang berbeda:

[  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

Di Mesin Virtual tanpa Ikatan

/etc/network/interfaces:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

Pengukuran dengan 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

Sedangkan iperfserver menghitung bandwidth yang berbeda:

[  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

Pada Mesin Virtual dengan Ikatan (tc dikonfigurasi pada eth0)

/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

Pengukuran dengan 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

Sedangkan iperfserver menghitung bandwidth yang berbeda:

[  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

Pada Mesin Virtual dengan Ikatan (tc dikonfigurasi pada bond0)

/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

Pengukuran dengan 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

Sedangkan iperfserver menghitung bandwidth yang berbeda:

[  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

Hasilnya tidak berubah jika saya menghapus eth1(antarmuka pasif) dari ikatan.

Kesimpulan

Kontrol Lalu Lintas pada antarmuka obligasi tidak berfungsi, atau setidaknya tidak seperti yang diharapkan. Saya harus menyelidiki lebih lanjut.

Sebagai solusinya, orang dapat menambahkan disiplin antrian langsung ke antarmuka milik ikatan.

Matías E. Fernández
sumber
Anehnya, ini sepertinya berhasil untuk orang ini: blog.tinola.com/?e=22
Matías E. Fernández
1
Saya pikir dengan htb, Anda harus menggunakan tc filteruntuk meletakkan paket ke dalam kelas. Anda mungkin juga perlu mengubah beberapa parameter htb (selaras seperti tbf). Saya sarankan melihat ke dalam tcng, yang merupakan front-end ke tc. (Ini adalah petunjuk cepat ...)
derobert
Saya tidak melihat filter di pos Anda. Perintah apa yang Anda gunakan untuk mencocokkan lalu lintas sehingga dapat dibatasi tingkat?

Jawaban:

2

Ketika Anda tidak yakin tentang cara kerja tc, Anda masih bisa memantau tc dan melihat bagaimana paket mengalir? Anda dapat menggunakan skrip saya untuk memonitor tc dan perlu menjalankannya di terminal dengan hak istimewa yang terangkat. Anda dapat mengubah wlan0 ke antarmuka lain dan Anda juga perlu grep dan awk:

      #!/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
Gigameg
sumber
0

Coba tambah nilai burst/ limit. The token bucket algoritma skala baik, tetapi memiliki rasio akurasi / kecepatan terbatas.

Akurasi dicapai dengan menggunakan ember kecil, mempercepat dengan meningkatkan ukuran token. Token besar berarti laju pengisian ulang menurun (token per detik = byte per detik / byte per token).

The rateparameter memberikan rata-rata tingkat yang tidak akan terlampaui, burstatau limitparameter memberikan ukuran jendela averaging. Karena pengiriman paket dengan kecepatan garis melebihi tingkat yang ditetapkan untuk waktu di mana paket ditransfer, jendela rata-rata harus setidaknya cukup besar sehingga pengiriman paket tunggal tidak mendorong seluruh jendela melebihi batas; jika lebih banyak paket yang cocok di jendela, algoritme akan memiliki peluang yang lebih baik untuk mencapai target dengan tepat.

Simon Richter
sumber
0

jalankan ini sebelum menambahkan disiplin antrian pada antarmuka ikatan (bond0 dalam kasus ini)

ipconfig bond0 txqueuelen 1000

itu tidak berfungsi karena perangkat lunak perangkat virtual seperti antarmuka ikatan tidak memiliki antrian default.

Kipas
sumber
0

Karena bondperangkat tidak memiliki antrian yang ditentukan, pengaturanqdisc ukuran secara eksplisit memperbaiki masalah bagi saya.

Berikut adalah contoh untuk daun yang qdiscdigunakan di bawah HTBstruktur: tc qdisc add dev $dev parent $parent handle $handle pfifo limit 1000

SagiLow
sumber