ฉันต้องการจำลองความล่าช้าและการสูญเสียแพ็กเก็ตสำหรับUDP
และTCP
บน Linux เพื่อวัดประสิทธิภาพของแอปพลิเคชัน มีวิธีง่าย ๆ ในการทำเช่นนี้?
ฉันต้องการจำลองความล่าช้าและการสูญเสียแพ็กเก็ตสำหรับUDP
และTCP
บน Linux เพื่อวัดประสิทธิภาพของแอปพลิเคชัน มีวิธีง่าย ๆ ในการทำเช่นนี้?
คำตอบ:
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 change
RTNETLINK answers: No such file or directory
tc -p qdisc ls dev eth0
จะแสดงกฎที่กำหนดไว้ในปัจจุบันและtc qdisc del dev eth0 root
จะลบออก
สำหรับแพ็กเก็ตลดลงฉันก็จะใช้ iptables และโมดูลสถิติ
iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP
ด้านบนจะวางแพ็กเก็ตขาเข้าที่มีความน่าจะเป็น 1% ระวังสิ่งใดที่สูงกว่า 0.14 และการเชื่อมต่อ TCP ส่วนใหญ่ของคุณจะเป็นไปได้อย่างสมบูรณ์
ลองดูที่ iptables ผู้ชายและค้นหา "สถิติ" สำหรับข้อมูลเพิ่มเติม
DROP
บนขาออกการเชื่อมต่อค่อนข้างขันเป็นสาเหตุที่ทำให้send()
การดำเนินงานเพื่อการกลับมาEPERM
แทนแล้วเพียงวางแพ็คเก็ต (อย่างที่ควร)
iptables -D INPUT -m statistic --mode random --probability 0.01 -j DROP
หนึ่งในเพื่อนร่วมงานของฉันใช้ tc เพื่อทำสิ่งนี้ อ้างถึง man page สำหรับข้อมูลเพิ่มเติม คุณสามารถดูตัวอย่างของการใช้งานของมันนี่
iptables (8) มีโมดูลจับคู่สถิติที่สามารถใช้จับคู่ทุก ๆ แพ็กเก็ตที่ n จะลดลงแพ็คเก็ตนี้เพียงผนวก-j DROP
นี้การสอนเกี่ยวกับระบบเครือข่ายแบบจำลองฟิสิกส์มี C ++ ชั้นในโค้ดตัวอย่างสำหรับการจำลองความล่าช้าและการสูญเสียแพ็คเก็ตในการเชื่อมต่อ UDP และอาจจะมีการให้คำแนะนำ ดูความหน่วงแฝงของสาธารณะและตัวแปรpacketLossของคลาสการเชื่อมต่อที่พบในไฟล์Connection.hของซอร์สโค้ดที่สามารถดาวน์โหลดได้
ยังไม่ได้ลองด้วยตนเอง แต่หน้านี้มีรายการโมดูลปลั๊กอินที่ทำงานใน Linux 'ที่สร้างขึ้นในระบบการกรอง IP ของ iptables หนึ่งในโมดูลที่เรียกว่า "nth" และช่วยให้คุณตั้งค่ากฎที่จะปล่อยอัตราที่กำหนดของแพ็คเก็ต อาจเป็นจุดเริ่มต้นที่ดีอย่างน้อย
คุณสามารถลองhttp://snad.ncsl.nist.gov/nistnet/ มันเป็นโครงการ NIST ที่ค่อนข้างเก่า (รุ่นล่าสุดปี 2005) แต่มันใช้งานได้สำหรับฉัน
ง่ายต่อการใช้เครือข่ายความผิดเครื่องมือฉีดเป็นผู้ก่อวินาศกรรม มันสามารถจำลอง:
- พาร์ติชันเครือข่ายทั้งหมด
- Remote service dead (ไม่ฟังพอร์ตที่ต้องการ)
- ความล่าช้า
- การสูญเสียแพ็คเก็ต - การหมดเวลาการเชื่อมต่อ TCP (มักเกิดขึ้นเมื่อระบบทั้งสองถูกคั่นด้วยไฟร์วอลล์แบบ stateful)
หนึ่งในเครื่องมือที่ใช้มากที่สุดในชุมชนวิทยาศาสตร์เพื่อวัตถุประสงค์ที่เป็น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
รายละเอียดเพิ่มเติมที่นี่