Hiểu tc qdisc và iperf


15

Tôi đang cố gắng hạn chế băng thông tcvà kiểm tra kết quả iperf. Tôi bắt đầu như thế này:

# 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

Hai trường hợp được kết nối trực tiếp với thông qua Ethernet.

Sau đó, tôi thiết lập một htb qdisclớp mặc định để giới hạn băng thông ở mức 1mbit / giây:

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

Nhưng tôi không nhận được những gì tôi mong đợi:

# 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

Nếu tôi tăng gấp đôi tốc độ, băng thông đo được sẽ không thay đổi. Tôi đang thiếu gì? Tại sao băng thông đo được không tương ứng với 1mbit từ ratetham số? Tôi cần đặt tham số nào để giới hạn băng thông ở một tỷ lệ chính xác?

Tuy nhiên, mantrang nói rằng tbfnên là qdisclựa chọn cho nhiệm vụ này:

Bộ lọc Token Xô phù hợp để làm chậm lưu lượng xuống mức được định cấu hình chính xác. Cân tốt đến băng thông lớn.

tbfđòi hỏi các thông số rate, burstvà ( limit| latency). Vì vậy, tôi đã thử cách sau mà không hiểu làm thế nào burstvà ( limit| latency) ảnh hưởng đến băng thông có sẵn:

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

Điều này giúp tôi có băng thông đo được là 113 Kbit / giây. Chơi xung quanh với các tham số đó đã không thay đổi nhiều cho đến khi tôi nhận thấy rằng việc thêm một giá trị cho mtunhững thay đổi mạnh mẽ:

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

dẫn đến băng thông đo được là 1,00 Mbits / giây.

Những thông số nào tôi cần đặt để giới hạn băng thông ở một tỷ lệ chính xác?

Tôi nên sử dụng htbhoặc tbfkỷ luật xếp hàng cho việc này?

CHỈNH SỬA :

Dựa trên những tài nguyên này, tôi đã thực hiện một số thử nghiệm:

Tôi đã thử các thiết lập sau.

Trên máy vật lý

/etc/network/interfaces:

auto lo
iface lo inet loopback

auto br0
iface br0 inet dhcp
bridge_ports eth0

Đo lường với 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

Trong khi đó iperfmáy chủ tính toán một băng thông khác nhau:

[  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

Trên máy ảo mà không cần liên kết

/etc/network/interfaces:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

Đo lường với 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

Trong khi đó iperfmáy chủ tính toán một băng thông khác nhau:

[  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

Trên máy ảo có liên kết (tc được định cấu hình trên 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

Đo lường với 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

Trong khi đó iperfmáy chủ tính toán một băng thông khác nhau:

[  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

Trên một máy ảo có liên kết (tc được cấu hình trên 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

Đo lường với 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

Trong khi đó iperfmáy chủ tính toán một băng thông khác nhau:

[  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

Kết quả không thay đổi nếu tôi loại bỏ eth1(giao diện thụ động) khỏi liên kết.

Phần kết luận

Kiểm soát lưu lượng trên giao diện trái phiếu không hoạt động hoặc ít nhất là không như mong đợi. Tôi sẽ phải điều tra thêm.

Như một cách giải quyết, người ta có thể thêm các nguyên tắc xếp hàng trực tiếp vào các giao diện thuộc về trái phiếu.


Thật kỳ lạ, điều này dường như đã làm việc cho anh chàng này: blog.tinola.com/?e=22
Matías E. Fernández

1
Tôi nghĩ với htb, bạn phải sử dụng tc filterđể đặt các gói vào các lớp. Bạn cũng có thể cần thay đổi một số tham số htb (điều chỉnh nó giống như tbf). Tôi đề nghị xem xét tcng, đó là một mặt trước để tc. (Đây là những gợi ý nhanh ...)
derobert

Tôi không thấy bất kỳ bộ lọc trong bài viết của bạn. Những lệnh nào bạn đang sử dụng để khớp với lưu lượng để có thể bị giới hạn tốc độ?

Câu trả lời:


2

Khi bạn không chắc chắn về cách thức hoạt động của tc, bạn vẫn có thể theo dõi tc và xem các gói dữ liệu chảy như thế nào? Bạn có thể sử dụng tập lệnh của tôi để theo dõi tc và cần chạy nó trong một thiết bị đầu cuối với đặc quyền được nâng lên. Bạn có thể thay đổi wlan0 sang giao diện khác và bạn cũng cần grep và 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

0

Hãy thử tăng burst/ limitgiá trị. Các thuật toán xô mã thông báo quy mô tốt, nhưng có tỷ lệ chính xác / tốc độ hạn chế.

Độ chính xác đạt được bằng cách sử dụng một thùng nhỏ, tốc độ bằng cách tăng kích thước của các mã thông báo. Mã thông báo lớn có nghĩa là tốc độ chúng được bổ sung bị giảm (mã thông báo mỗi giây = byte mỗi giây / byte mỗi mã thông báo).

Các ratethông số cung cấp cho các trung bình tỷ lệ đó không phải là để được vượt quá, bursthoặc limitcác thông số cho kích thước của cửa sổ trung bình. Vì việc gửi một gói ở tốc độ đường truyền vượt quá tốc độ đã đặt trong thời gian gói được chuyển, cửa sổ trung bình cần phải đủ lớn nhất để gửi một gói không đẩy toàn bộ cửa sổ vượt quá giới hạn; nếu có nhiều gói phù hợp hơn trong cửa sổ, thuật toán sẽ có cơ hội trúng đích chính xác hơn.


0

chạy này trước khi thêm kỷ luật hàng đợi trên giao diện liên kết (bond0 trong trường hợp này)

ipconfig bond0 txqueuelen 1000

Nó không hoạt động vì thiết bị ảo phần mềm như giao diện liên kết không có hàng đợi mặc định.


0

bondcác thiết bị không có hàng đợi được xác định, việc đặt qdisckích thước sẽ khắc phục rõ ràng sự cố cho tôi.

Dưới đây là một ví dụ cho một chiếc lá qdiscđược sử dụng theo HTBcấu trúc: tc qdisc add dev $dev parent $parent handle $handle pfifo limit 1000

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.