ทำความเข้าใจกับ tc qdisc และ iperf


15

ฉันพยายามที่จะ จำกัด การแบนด์วิดธ์และตรวจสอบผลกับtc iperfฉันเริ่มต้นเช่นนี้:

# 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

สองอินสแตนซ์เชื่อมต่อโดยตรงผ่านอีเธอร์เน็ต

ฉันตั้งค่า a htb qdiscคลาสเริ่มต้นหนึ่งตัวเพื่อ จำกัด แบนด์วิดท์ไว้ที่ 1mbit / วินาที:

# 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.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

ถ้าฉันเพิ่มอัตราเป็นสองเท่าแบนด์วิดท์ที่วัดได้จะไม่เปลี่ยนแปลง ฉันกำลังคิดถึงอะไร ทำไมแบนด์วิดท์ที่วัดได้ไม่ตรงกับ 1mbit จากrateพารามิเตอร์ ฉันต้องตั้งค่าพารามิเตอร์ใดเพื่อ จำกัด แบนด์วิดท์ให้เป็นอัตราที่กำหนดแน่นอน

อย่างไรก็ตามmanหน้าระบุว่าtbfควรเป็นqdiscตัวเลือกสำหรับงานนี้:

ถังกรองโทเค็นเหมาะสำหรับการลดทราฟฟิกลงสู่อัตราที่กำหนดไว้อย่างแม่นยำ ปรับขนาดได้ดีกับแบนด์วิดท์ขนาดใหญ่

tbfต้องใช้พารามิเตอร์rate, burstและ ( limit| latency) ดังนั้นฉันจึงลองทำสิ่งต่อไปนี้โดยไม่เข้าใจว่าburst( limit| latency) มีผลกับแบนด์วิดท์ที่มีอยู่อย่างไร:

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

นี่ทำให้ฉันวัดแบนด์วิดธ์ได้ที่ 113 Kbits / วินาที การเล่นกับพารามิเตอร์เหล่านั้นไม่ได้เปลี่ยนแปลงมากนักจนกระทั่งฉันสังเกตเห็นว่าการเพิ่มค่าสำหรับmtuการเปลี่ยนแปลงต่าง ๆ เป็นไปอย่างรุนแรง:

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

ส่งผลให้วัดแบนด์วิดท์ที่ 1.00 Mbits / วินาที

ฉันจะต้องตั้งค่าพารามิเตอร์ใดเพื่อ จำกัด แบนด์วิดท์ให้เป็นอัตราที่กำหนดแน่นอน

ฉันควรใช้htbหรือtbfจัดคิวระเบียบนี้หรือไม่?

แก้ไข :

จากแหล่งข้อมูลเหล่านี้ฉันได้ทำการทดสอบบางอย่าง:

ฉันลองตั้งค่าต่อไปนี้แล้ว

บนเครื่องทางกายภาพ

/etc/network/interfaces:

auto lo
iface lo inet loopback

auto br0
iface br0 inet dhcp
bridge_ports eth0

การวัดด้วย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

ในขณะที่iperfเซิร์ฟเวอร์คำนวณแบนด์วิดท์ที่แตกต่างกัน:

[  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

บนเครื่องเสมือนโดยไม่ต้องเชื่อม

/etc/network/interfaces:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

การวัดด้วย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

ในขณะที่iperfเซิร์ฟเวอร์คำนวณแบนด์วิดท์ที่แตกต่างกัน:

[  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

บนเครื่องเสมือนที่มีการเชื่อม (tc ที่กำหนดค่าบน 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

การวัดด้วย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

ในขณะที่iperfเซิร์ฟเวอร์คำนวณแบนด์วิดท์ที่แตกต่างกัน:

[  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

บนเครื่องเสมือนที่มีการเชื่อม (tc กำหนดค่าบน 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

การวัดด้วย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

ในขณะที่iperfเซิร์ฟเวอร์คำนวณแบนด์วิดท์ที่แตกต่างกัน:

[  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

ผลลัพธ์จะไม่เปลี่ยนแปลงหากฉันลบeth1(อินเตอร์เฟสแบบพาสซีฟ) จากพันธะ

ข้อสรุป

การควบคุมปริมาณการใช้งานบนส่วนต่อประสานไม่ทำงานหรืออย่างน้อยก็ไม่เป็นไปตามที่คาดไว้ ฉันจะต้องตรวจสอบเพิ่มเติม

ในฐานะที่เป็นวิธีแก้ปัญหาอย่างใดอย่างหนึ่งสามารถเพิ่มวินัยการจัดคิวโดยตรงกับอินเตอร์เฟซที่เป็นของพันธบัตร


น่าประหลาดใจที่สิ่งนี้ดูเหมือนจะใช้ได้กับผู้ชายคนนี้: blog.tinola.com/?e=22
Matías E. Fernández

1
ฉันคิดว่าด้วย htb คุณต้องใช้tc filterเพื่อใส่แพ็กเก็ตลงในคลาส คุณอาจต้องเปลี่ยนพารามิเตอร์ htb บางตัว (ปรับแต่งเหมือน tbf) ฉันแนะนำให้ดูtcngซึ่งเป็นส่วนหน้าของ tc (นี่คือตัวชี้อย่างรวดเร็ว ... )
Derobert

ฉันไม่เห็นตัวกรองใด ๆ ในโพสต์ของคุณ คุณใช้คำสั่งใดเพื่อจับคู่ทราฟฟิกเพื่อให้สามารถ จำกัด อัตราได้

คำตอบ:


2

เมื่อคุณไม่แน่ใจเกี่ยวกับวิธีการทำงานของ tc คุณยังสามารถตรวจสอบ tc และดูว่าแพ็กเก็ตไหลอย่างไร คุณสามารถใช้สคริปต์ของฉันเพื่อตรวจสอบ tc และจำเป็นต้องเรียกใช้ในเทอร์มินัลที่มีสิทธิ์ยก คุณสามารถเปลี่ยน wlan0 เป็นอินเตอร์เฟสอื่นและคุณต้อง grep และ 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

ลองเพิ่มburst/ limitค่า ถังโทเค็นอัลกอริทึมระดับดี แต่มีความถูกต้อง / อัตราส่วนความเร็วที่ จำกัด

ความแม่นยำนั้นทำได้โดยการใช้ถังขนาดเล็กความเร็วโดยการเพิ่มขนาดของโทเค็น โทเค็นขนาดใหญ่หมายถึงอัตราการเติมเต็มจะลดลง (โทเค็นต่อวินาที = ไบต์ต่อวินาที / ไบต์ต่อโทเค็น)

rateพารามิเตอร์ให้เฉลี่ยอัตราที่ไม่ควรเกินนี้burstหรือlimitพารามิเตอร์ให้ขนาดของหน้าต่างเฉลี่ยที่ เมื่อส่งแพ็คเก็ตที่ความเร็วบรรทัดเกินกว่าอัตราที่ตั้งไว้สำหรับเวลาที่มีการถ่ายโอนแพ็คเก็ตหน้าต่างเฉลี่ยต้องมีขนาดใหญ่พอที่การส่งแพ็คเก็ตเดียวไม่ได้ผลักทั้งหน้าต่างเกินขีด จำกัด ถ้ามีแพ็กเก็ตเพิ่มเติมพอดีในหน้าต่างอัลกอริทึมจะมีโอกาสชนเป้าหมายได้ดีกว่า


0

รันสิ่งนี้ก่อนที่จะเพิ่มวินัยคิวในการเชื่อมประสาน (bond0 ในกรณีนี้)

ipconfig bond0 txqueuelen 1000

ไม่ทำงานเนื่องจากอุปกรณ์เสมือนซอฟต์แวร์เช่นส่วนต่อประสานไม่มีคิวเริ่มต้น


0

เนื่องจากbondอุปกรณ์ไม่มีคิวที่กำหนดการตั้งค่าqdiscขนาดจะแก้ไขปัญหาให้ฉันอย่างชัดเจน

นี่คือตัวอย่างสำหรับ leaf qdiscที่จะใช้ภายใต้HTBโครงสร้าง: tc qdisc add dev $dev parent $parent handle $handle pfifo limit 1000

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.