ปัญหา: เมื่อใช้ tc HTB หรือ CQB เพื่อสร้างทราฟฟิก แพ็กเก็ตสองแพ็กเก็ตแรกที่ส่งหลังจากเว้นช่วงระยะหนึ่งจะถูกส่งกลับไปกลับมาตามที่บันทึกไว้ในบันทึก pcap
ฉันมีคอมพิวเตอร์ระดับกลางที่มี Ubuntu 18.4 ที่เปิดใช้งานการส่งต่อเครือข่าย ฉันรัน tc ด้วย HTB เพื่อกำหนดทราฟฟิกให้มีเอาต์พุตบิตเรตคงที่บนพอร์ตขาออก
ลูกค้าร้องขอชิ้นที่มีขนาดตัวแปรจากเซิร์ฟเวอร์ เซิร์ฟเวอร์ส่งข้อมูลที่เข้ารหัสการถ่ายโอนก้อนที่มีช่องว่าง 200ms ระหว่างแต่ละก้อนไปยังไคลเอนต์ เมื่อการตั้งค่าของฉันมีคอมพิวเตอร์ระดับกลาง แพ็กเก็ตเหล่านี้จะถูกส่งผ่านทราฟฟิก Shaper บนคอมพิวเตอร์ระดับกลางเพื่อให้ได้บิตเรตคงที่ที่ 500kbps
เมื่อฉันปิดใช้งาน offload (TSO และ GRO) แต่ละ n ไบต์จะถูกแบ่งออกเป็นเฟรมโดย pcap
แพ็กเก็ต 1448B ส่วนใหญ่มีช่องว่างเวลาใกล้เคียงกับ 24.224ms ซึ่งคาดว่าจะอยู่ที่ 500kbps
ปัญหา: แม้ว่าเฟรมจะมาถึงตามลำดับ แต่ช่องว่างของเวลาที่มาถึงไม่สอดคล้องกัน
แพ็กเก็ตขนาดใหญ่ที่สอง (1448B) หลังจากช่องว่าง 200 มิลลิวินาทีมักจะกลับมาเกือบชนกับแพ็กเก็ตแรกเสมอ
แพ็กเก็ตสุดท้ายเป็นกลุ่ม (654B) มาถึงโดยมีความล่าช้า (24.224ms แทนที่จะเป็น 10.464ms ในตัวอย่างในรูปที่แนบมา)
ภาพหน้าจอของการกำหนดเวลา
ช่องว่างเวลาระหว่างแพ็กเก็ต
คำสั่ง TC กับ HTB:
tc qdisc เดล dev enx00e04c080ecf รูท 2> /dev/null > /dev/null
tc qdisc เพิ่ม dev enx00e04c080ecf ตัวจัดการรูท 1:0 htb เริ่มต้น 2
คลาส tc เพิ่ม dev enx00e04c080ecf พาเรนต์ 1:1 classid 1:2 อัตรา htb 500kbit ceil 500kbit ระเบิด 10 cburst 10 prio 2
ตัวกรอง tc เพิ่ม dev enx00e04c080ecf โปรโตคอล ip parent 1:0 u32 จับคู่ ip dst 192.168.2.103 flowid 1:2
หากฉันไม่ได้ทำการคำนวณผิดพลาด ฉันคิดว่าปัญหาอาจเกิดจากการจัดการโทเค็นใน tc ที่ฉันใช้สำหรับการสร้างทราฟิก
ฉันคิดว่าโทเค็นถูกสะสมในช่วงเวลาว่าง และเมื่อได้รับแพ็กเก็ตถัดไป มันจะส่งแพ็กเก็ตสองแพ็กเก็ตกลับไปกลับมา
จากอัตราการบริโภคโทเค็นแพ็กเก็ตที่สามตกลง
หากนี่คือสิ่งที่เกิดขึ้น ฉันต้องการทราบว่ามีวิธีหลีกเลี่ยงการใช้โทเค็นที่สะสมสำหรับแพ็กเก็ตที่สองในกลุ่มหรือไม่
ฉันลองใช้ตัวเลือกต่าง ๆ ในคำสั่ง tc
ฉันยังลองใช้ CQB - คำสั่งด้านล่าง
อ้างอิง : https://lartc.org/lartc.html#AEN2233
ข้อสังเกต:
ลดการระเบิด = 10 เพิ่มช่องว่างระหว่างแพ็กเก็ตที่หนึ่งและที่สองเล็กน้อย
tc ด้วย CQB:
tc qdisc เดล dev enx00e04c080ecf รูท 2> /dev/null > /dev/null
tc qdisc เพิ่ม dev enx00e04c080ecf ที่จับรูต 1: cbq avpkt 5000 แบนด์วิดท์ 10mbit
คลาส tc เพิ่ม dev enx00e04c080ecf พาเรนต์ 1: classid 1:1 อัตรา cbq 500kbit จัดสรร 5000 prio 5 แยกขอบเขต
tc class เพิ่ม dev enx00e04c080ecf parent 1:1 classid 1:10 อัตรา cbq 500kbit allot 5000 prio 1 avpkt 5000 ขอบเขต
คลาส tc เพิ่ม dev enx00e04c080ecf parent 1:1 classid 1:20 อัตรา cbq 500kbit allot 5000 avpkt 5000 prio 2
ตัวกรอง tc เพิ่ม dev enx00e04c080ecf โปรโตคอล ip parent 1:0 u32 จับคู่ ip dst 192.168.2.103 flowid 1:10
ตัวกรอง tc เพิ่ม dev enx00e04c080ecf parent 1: โปรโตคอล ip prio 13 u32 จับคู่ ip dst 0.0.0.0/0 flowid 1:20