จำลองแพคเก็ตล่าช้าและลดลงบน Linux


246

ฉันต้องการจำลองความล่าช้าและการสูญเสียแพ็กเก็ตสำหรับUDPและTCPบน Linux เพื่อวัดประสิทธิภาพของแอปพลิเคชัน มีวิธีง่าย ๆ ในการทำเช่นนี้?



1
สำหรับ OS X โปรดดู: superuser.com/questions/173882/…
Lenar Hoyt

คำตอบ:


323

netemใช้ประโยชน์จากฟังก์ชั่นที่มีอยู่แล้วใน Linux และยูทิลิตี้userpaceเพื่อจำลองเครือข่าย นี่คือสิ่งที่คำตอบของ Mark อ้างถึงโดยใช้ชื่ออื่น

ตัวอย่างในหน้าแรกของพวกเขาแสดงให้เห็นว่าคุณจะบรรลุสิ่งที่คุณต้องการได้อย่างไร:

ตัวอย่าง

การจำลองเครือข่ายบริเวณกว้างเกิดความล่าช้า

นี่เป็นตัวอย่างที่ง่ายที่สุดเพียงเพิ่มการหน่วงเวลาจำนวนคงที่ให้กับแพ็คเก็ตทั้งหมดที่ออกจากอีเทอร์เน็ตท้องถิ่น

# tc qdisc add dev eth0 root netem delay 100ms

ตอนนี้การทดสอบ ping อย่างง่าย ๆ เพื่อโฮสต์บนเครือข่ายท้องถิ่นควรแสดงการเพิ่มขึ้น 100 มิลลิวินาที ความล่าช้าถูก จำกัด โดยความละเอียดสัญญาณนาฬิกาของเคอร์เนล (Hz) ในระบบส่วนใหญ่ 2.4 นาฬิการะบบจะทำงานที่ 100 เฮิร์ตซ์ซึ่งช่วยให้การหน่วงเวลาเพิ่มขึ้น 10 มิลลิวินาที บน 2.6 ค่าเป็นพารามิเตอร์การกำหนดค่าจาก 1,000 ถึง 100 Hz

ตัวอย่างในภายหลังเพียงแค่เปลี่ยนพารามิเตอร์โดยไม่ต้องโหลด qdisc

เครือข่ายบริเวณกว้างจริงแสดงความแปรปรวนดังนั้นจึงเป็นไปได้ที่จะเพิ่มการเปลี่ยนแปลงแบบสุ่ม

# tc qdisc change dev eth0 root netem delay 100ms 10ms

สิ่งนี้ทำให้การหน่วงเวลาที่เพิ่มเข้ามาเป็น 100 ± 10 ms รูปแบบการหน่วงเวลาของเครือข่ายไม่ได้สุ่มอย่างแท้จริงดังนั้นเพื่อเลียนแบบว่ามีค่าความสัมพันธ์เช่นกัน

# tc qdisc change dev eth0 root netem delay 100ms 10ms 25%

สิ่งนี้ทำให้การหน่วงเวลาเพิ่มเป็น 100 ± 10 ms ด้วยองค์ประกอบแบบสุ่มถัดไปซึ่งขึ้นอยู่กับ 25% ในช่วงสุดท้าย นี่ไม่ใช่ความสัมพันธ์ทางสถิติที่แท้จริง แต่เป็นการประมาณ

การกระจายความล่าช้า

โดยทั่วไปความล่าช้าในเครือข่ายไม่เหมือนกัน เป็นเรื่องปกติมากที่จะใช้การแจกแจงแบบปกติเพื่ออธิบายความแปรปรวนของความล่าช้า วินัย netem สามารถใช้ตารางเพื่อระบุการแจกแจงแบบไม่สม่ำเสมอ

# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal

ตารางจริง (ปกติ, pareto, paretonormal) ถูกสร้างขึ้นเป็นส่วนหนึ่งของการรวบรวม iproute2 และวางไว้ใน / usr / lib / tc; ดังนั้นจึงเป็นไปได้ด้วยความพยายามในการสร้างการกระจายของคุณเองตามข้อมูลการทดลอง

การสูญเสียแพ็คเก็ต

การสูญเสียแพ็กเก็ตแบบสุ่มถูกระบุในคำสั่ง 'tc' เป็นเปอร์เซ็นต์ ค่าที่ไม่เป็นศูนย์ที่เล็กที่สุดที่เป็นไปได้คือ:

2 −32 = 0.0000000232%

# tc qdisc change dev eth0 root netem loss 0.1%

สิ่งนี้ทำให้แพ็คเก็ต 1 / 10th ของเปอร์เซ็นต์ (เช่น 1 จาก 1,000) ถูกสุ่มลดลง

อาจมีการเพิ่มสหสัมพันธ์ที่เป็นตัวเลือก สิ่งนี้ทำให้ตัวสร้างตัวเลขสุ่มสุ่มน้อยลงและสามารถใช้เพื่อจำลองการสูญเสียการระเบิดของแพ็กเก็ต

# tc qdisc change dev eth0 root netem loss 0.3% 25%

สิ่งนี้จะทำให้แพ็คเก็ตหายไป 0.3% และความน่าจะเป็นต่อเนื่องแต่ละครั้งขึ้นอยู่กับหนึ่งในสี่ของแพ็คเก็ตสุดท้าย

Prob n = 0.25 × Prob n-1 + 0.75 ×สุ่ม

โปรดทราบว่าคุณควรใช้tc qdisc addหากคุณไม่มีกฎสำหรับส่วนต่อประสานนั้นหรือtc qdisc changeหากคุณมีกฎสำหรับส่วนต่อประสานนั้นอยู่แล้ว พยายามที่จะใช้ในอินเตอร์เฟซที่มีกฎไม่จะให้ข้อผิดพลาดtc qdisc changeRTNETLINK answers: No such file or directory


2
เว็บไซต์ดั้งเดิมมีข้อผิดพลาดฉันเพิ่งคัดลอกข้อความนั้นโดยตรง แต่ใช่ 2 ^ (- 32) = 2.33e-10
ephemient

34
โปรดทราบว่าtc -p qdisc ls dev eth0จะแสดงกฎที่กำหนดไว้ในปัจจุบันและtc qdisc del dev eth0 rootจะลบออก
Quamis

1
upvoted สำหรับการชี้ข้อผิดพลาดเมื่อพยายามเปลี่ยนรายการที่ไม่มีอยู่
Neo

คุณรู้หรือไม่ว่าทำไมฉันถึงได้รับข้อผิดพลาดเหล่านี้? ubuntu @ anmol-vm1-new: / home / hadoop / yarnpp / workloads / ผลการค้นหา $ sudo tc qdisc เพิ่ม dev eth0 root netem ล่าช้า 100ms คำตอบ RTNETLINK: ไฟล์มีอยู่ ubuntu @ anmol-vm1-new: ผล / $ sudo TC qdisc เปลี่ยนแปลง dev eth0 ราก netem ล่าช้า 100ms ตอบ RTNETLINK: อาร์กิวเมนต์ไม่ถูกต้องserverfault.com/questions/743885/...
โมนา Jalal

มันอาจจะเป็นความคิดที่ดีที่จะรวมรายละเอียดวิธีการ จำกัด จำนวนการรับส่งข้อมูลอินเทอร์เฟซทั้งหมดเพื่อจำลองลิงก์ความเร็วต่ำ
Pavel P

91

สำหรับแพ็กเก็ตลดลงฉันก็จะใช้ iptables และโมดูลสถิติ

iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP

ด้านบนจะวางแพ็กเก็ตขาเข้าที่มีความน่าจะเป็น 1% ระวังสิ่งใดที่สูงกว่า 0.14 และการเชื่อมต่อ TCP ส่วนใหญ่ของคุณจะเป็นไปได้อย่างสมบูรณ์

ลองดูที่ iptables ผู้ชายและค้นหา "สถิติ" สำหรับข้อมูลเพิ่มเติม


6
เหตุใดการเชื่อมต่อ TCP จะหยุดทำงานที่อะไรที่สูงกว่า 14%
David Wolever

2
@DavidWolever: เนื่องจากวิธีการปรับขนาดหน้าต่างบานเลื่อน tcp แต่ 14% นั้นมาจากประสบการณ์ล้วนๆลองดูด้วยตัวคุณเองแล้วคุณจะเห็นว่า ssh ไม่สามารถใช้งานได้ที่ 14% ขึ้นไป แต่จริงๆแล้วใช้งานได้ดีในระดับที่ต่ำกว่าของอัตราการลดลงของแพ็กเก็ต
Bjarke Freund-Hansen

12
เพื่อความปลอดภัยคุณควร จำกัด กฎที่จะใช้เฉพาะกับพอร์ตที่คุณต้องการทดสอบ: iptables -A INPUT - สถิติพอร์ต FOO -m วิธีนี้ ssh และการเชื่อมต่ออื่น ๆ ของคุณจะ ยังคงไม่ถูกรบกวนและคุณสามารถชนอัตราการปล่อยสำหรับบริการที่น่าสนใจเพื่อให้สามารถทำซ้ำปัญหาใด ๆ ได้เร็วขึ้น
Mikhail T.

5
โปรดทราบว่าDROPบนขาออกการเชื่อมต่อค่อนข้างขันเป็นสาเหตุที่ทำให้send()การดำเนินงานเพื่อการกลับมาEPERMแทนแล้วเพียงวางแพ็คเก็ต (อย่างที่ควร)
ชื่อปลอม

2
นี่คือทั้งหมดที่จำเป็นในการยกเลิกคำสั่งนั้นหรือไม่ iptables -D INPUT -m statistic --mode random --probability 0.01 -j DROP
jcalfee314

6

หนึ่งในเพื่อนร่วมงานของฉันใช้ tc เพื่อทำสิ่งนี้ อ้างถึง man page สำหรับข้อมูลเพิ่มเติม คุณสามารถดูตัวอย่างของการใช้งานของมันนี่


ฉันคิดว่ามันง่ายกว่าที่จะใช้ iptables :)
c4f4t0r

แน่ใจ แต่ TC มากขึ้นเร็วกว่า iptables
teknoraver

5

iptables (8) มีโมดูลจับคู่สถิติที่สามารถใช้จับคู่ทุก ๆ แพ็กเก็ตที่ n จะลดลงแพ็คเก็ตนี้เพียงผนวก-j DROP


3

นี้การสอนเกี่ยวกับระบบเครือข่ายแบบจำลองฟิสิกส์มี C ++ ชั้นในโค้ดตัวอย่างสำหรับการจำลองความล่าช้าและการสูญเสียแพ็คเก็ตในการเชื่อมต่อ UDP และอาจจะมีการให้คำแนะนำ ดูความหน่วงแฝงของสาธารณะและตัวแปรpacketLossของคลาสการเชื่อมต่อที่พบในไฟล์Connection.hของซอร์สโค้ดที่สามารถดาวน์โหลดได้


1

ยังไม่ได้ลองด้วยตนเอง แต่หน้านี้มีรายการโมดูลปลั๊กอินที่ทำงานใน Linux 'ที่สร้างขึ้นในระบบการกรอง IP ของ iptables หนึ่งในโมดูลที่เรียกว่า "nth" และช่วยให้คุณตั้งค่ากฎที่จะปล่อยอัตราที่กำหนดของแพ็คเก็ต อาจเป็นจุดเริ่มต้นที่ดีอย่างน้อย



1

ง่ายต่อการใช้เครือข่ายความผิดเครื่องมือฉีดเป็นผู้ก่อวินาศกรรม มันสามารถจำลอง:

  • พาร์ติชันเครือข่ายทั้งหมด
  • Remote service dead (ไม่ฟังพอร์ตที่ต้องการ)
  • ความล่าช้า
  • การสูญเสียแพ็คเก็ต - การหมดเวลาการเชื่อมต่อ TCP (มักเกิดขึ้นเมื่อระบบทั้งสองถูกคั่นด้วยไฟร์วอลล์แบบ stateful)

1
น่าเศร้าที่ความมุ่งมั่นสุดท้ายต่อโครงการนั้นคือเมื่อวันที่ 28 สิงหาคม 2558 นั่นคือเกือบ 4 ปีที่แล้ว ปัญหาที่เปิดอยู่ในขณะนี้อายุ 5 ปี
Ali

1

หนึ่งในเครื่องมือที่ใช้มากที่สุดในชุมชนวิทยาศาสตร์เพื่อวัตถุประสงค์ที่เป็นDummyNet เมื่อคุณติดตั้งipfwโมดูลเคอร์เนลเพื่อแนะนำการหน่วงเวลาการแพร่กระจาย 50ms ระหว่าง 2 เครื่องเพียงแค่เรียกใช้คำสั่งเหล่านี้:

./ipfw pipe 1 config delay 50ms
./ipfw add 1000 pipe 1 ip from $IP_MACHINE_1 to $IP_MACHINE_2

ในการแนะนำ 50% ของความสูญเสียของแพ็กเก็ตคุณต้องเรียกใช้:

./ipfw pipe 1 config plr 0.5

รายละเอียดเพิ่มเติมที่นี่

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