วิธีเล่นทราฟฟิกกับเครือข่ายเงา


12

ขออภัยหากเป็นคำถามใหม่ ...

ฉันเคยได้ยินเรื่องราวของ Netflix และ Twitter ที่สามารถทำซ้ำการรับส่งข้อมูลเว็บระหว่างโครงสร้างพื้นฐานที่แยกกันสองแห่ง: อันหนึ่งเป็นที่เชื่อถือได้ / เชื่อถือได้ซึ่งกลับไปที่ผู้ใช้ และอีกอันคือ 'เงา' หรือโครงสร้างพื้นฐานการทดสอบที่คิดว่ามันจะกลับไปหาผู้ใช้ แต่ไม่ได้ ประเด็นคือเพื่อทดสอบโครงสร้างพื้นฐานที่สองที่ภาระและเวลาในชีวิตจริง

ฉันค่อนข้างแน่ใจว่ามีคำที่จะอธิบายสิ่งนี้ แต่ 'สะพาน' ดูเหมือนจะไม่ถูกต้องหรือไม่ 'เล่นซ้ำ'

ใครสามารถช่วยฉันด้วยสิ่งที่เรียกว่าเทคนิคนี้และ / หรือเครื่องมือที่สามารถใช้ในการบรรลุสิ่งนี้

ฉันเดาว่าฉันควรจะเพิ่มว่าฉันได้ยินเกี่ยวกับเทคนิคที่มีประสิทธิภาพในการ 'เล่นซ้ำบันทึก' แต่มันยากมากที่จะได้รับความเร็วจริง / การแจกแจง

และเราไม่ได้พยายามตรวจสอบ 'ความถูกต้อง' ของผลลัพธ์ แต่เพียงตรวจสอบให้แน่ใจว่าเราไม่เห็นข้อผิดพลาด / stacktraces / ฯลฯ ในโครงสร้างพื้นฐานใหม่


วิธีที่ชัดเจนในการทำเช่นนี้ (โดยใช้สวิตช์กับพอร์ตมิเรอร์เพื่อทำซ้ำปริมาณข้อมูลขาเข้า) ดูเหมือนว่าจะทำให้เกิดปัญหาเมื่อเซิร์ฟเวอร์ "เงา" เหล่านั้นพยายามตอบกลับ ตอนนี้คุณทำให้ฉันสนใจในวิธีที่ไม่ชัดเจน
DerfK

@DerfK: การเล่นเลเยอร์อย่างง่ายเลเยอร์ 2 หรือ 3 ใหม่จะเป็นปัญหาหากคุณไม่ต้องการเขียนโค้ดเพื่อจำลองสแต็ก TCP / IP ของไคลเอนต์ระยะไกล การจับภาพที่เลเยอร์ 7 เป็นวิธีที่ทำได้มากกว่าหากคุณไม่ต้องการเขียนโค้ดจำนวนมาก
Evan Anderson

ฉันไม่คิดว่ามันยากที่จะใช้มันในระดับแพ็กเก็ต โปรดดู tcpcopy ( github.com/wangbin579/tcpcopy )

คำตอบ:


7

ฉันจะเรียกมันว่า "การทดสอบโหลดผ่านการเล่นซ้ำเซสชัน" โดยส่วนตัว ฉันไม่ทราบคำศัพท์ง่าย ๆ สำหรับเทคนิคการทดสอบประเภทนี้

กลยุทธ์พื้นฐานที่ฉันเคยเห็นสำหรับการทดสอบโหลดประเภทนี้คือการนำไฟล์บันทึกจากระบบการผลิตและเล่นซ้ำในระบบทดสอบ

คุณสามารถใช้เครื่องมือเช่นJMeterหรือApache Benchเพื่อเล่นซ้ำคำขอจากไฟล์บันทึก หากคุณกำลังดูการโต้ตอบระหว่างไคลเอนต์ / เซิร์ฟเวอร์ที่ซับซ้อนมาก (โดยมีรายละเอียดเวลาเฉพาะตามสตรีมบันทึกดั้งเดิม) โดยหวังว่าจะออกกำลังกายอวัยวะภายในของแอปพลิเคชันของคุณอย่างแท้จริง (มองหาสภาพการแข่งขัน ดูการเขียนเครื่องมือทดสอบเฉพาะแอปพลิเคชันที่จำลองไคลเอนต์ในระดับ

คุณจะไม่สามารถดักจับปริมาณการรับส่งข้อมูลของเครือข่ายสดและ "เล่นซ้ำ" ด้วยโปรโตคอล TCP หรือ IP ใด ๆ หมายเลขลำดับ TCP จะไม่ตรงกับทราฟฟิกที่บันทึกไว้เดิมและจะไม่ทำงาน การจับเลเยอร์ IP จะเป็นปัญหาเนื่องจากไคลเอนต์จำลองของคุณจะต้องตอบที่อยู่ IP ของผู้ส่งที่ถูกจับ คุณควรที่จะจับภาพทราฟฟิกที่อยู่ใกล้กับเลเยอร์ 7 ให้ดียิ่งขึ้นและใช้สิ่งนั้นเพื่อเล่นซ้ำเซสชันเพราะมิฉะนั้นคุณก็กำลังเขียนตัวจำลอง TCP ด้วยเช่นกัน (ฉันสามารถจินตนาการได้ว่าใช้บางสิ่งบางอย่างเช่นtsharkการแยกข้อมูลเลเยอร์ 7 และจังหวะเวลาจากสตรีม TCP และเล่นซ้ำเช่นนั้น)

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


1

คุณใช้บริการเช่นBrowserMobซึ่งจำลองผู้คนจำนวนมากเข้าถึงเว็บไซต์ของคุณพร้อมกัน บริการเหล่านี้จะไม่เล่นซ้ำปริมาณข้อมูลที่บันทึกไว้เพราะคุณจะขาดการติดต่อกับลูกค้า เช่นเซิร์ฟเวอร์ของคุณกำลังพยายามส่งแพ็กเก็ตไปยังคอมพิวเตอร์บนอินเทอร์เน็ตที่ไม่คาดหวังว่าจะได้รับ แต่สิ่งที่ บริษัท เหล่านี้ทำคือศึกษาบันทึก (โดยทั่วไปอยู่ในระดับแอปพลิเคชันไม่ใช่ระดับแพ็กเก็ต) และใช้ข้อมูลนั้นเพื่อพิจารณาว่าผู้ใช้คลิกหน้าใดบ่อยแค่ไหนและเรียงตามลำดับใด ข้อมูลนี้ใช้เพื่อเขียนสคริปต์ / มาโครซึ่ง BrowserMob จะทำซ้ำ

ApacheBench ตามที่ผู้ใช้รายอื่นกล่าวถึงไม่ได้ใช้งานมากนักในวันนี้ มันมีประโยชน์มากกว่าเมื่อ 10 ปีที่แล้วเมื่อคุณต้องการรู้ว่าเอกสาร HTML หรือ JPEG แบบสแตติกสามารถให้บริการได้อย่างรวดเร็วเพียงใดในภาระงานหนัก มันไม่ได้แตกต่างจากคนจำนวนมากที่คลิกรีโหลดโหลดซ้ำแล้วซ้ำอีกบนเว็บเบราว์เซอร์ คุณต้องการบางสิ่งที่ฉลาดกว่าเมื่อทดสอบแอปพลิเคชันเว็บที่มีเวิร์กโฟลว์ที่ซับซ้อนมากขึ้น


1

ฉันไม่คิดว่าคุณสามารถทำสิ่งนี้ได้ที่เลเยอร์เครือข่ายแม้ว่าคุณจะได้รับเคอร์เนลพิเศษสำหรับฮาร์ดแวร์โหลดบาลานเซอร์เพื่อจัดการเซิร์ฟเวอร์ที่สอง โดยทั่วไปการรับส่งข้อมูลทางเว็บ (TCP) จะต้องการการตอบรับของแต่ละแพ็คเก็ตที่ส่ง / รับ ดังนั้นหากผู้ใช้ส่งแพ็คเก็ตไปยังเครือข่ายของคุณก็จะได้รับการทำซ้ำทั้งเครือข่ายแยงและเครือข่ายเงาของคุณ เซิร์ฟเวอร์ในการตอบกลับแต่ละเครือข่ายและแพ็คเก็ตของเซิร์ฟเวอร์ Prod จะถูกส่งต่อกลับไปยังเครื่องของคุณซึ่งจะส่งการตอบรับกลับมาและพวกเขาจะดำเนินการสนทนาอย่างสนุกสนาน อย่างไรก็ตามหากคุณวางแพ็กเก็ตเซิร์ฟเวอร์เงาของคุณเงาจะไม่เห็นการตอบรับ ดังนั้นจึงจะลองส่งอีกครั้งและในขณะเดียวกันก็ชะลอความเร็วในการส่งสำหรับกิจกรรมเครือข่ายทั้งหมด (ซึ่งเรียกว่าการเปิดหน้าต่าง) มันจะพยายามส่งต่อไปจนกว่าจะหมดเวลา และเซสชั่นจะถูกฉีกลง สุจริตคุณจะไม่สามารถจับมือกันเพื่อสร้างการเชื่อมต่อได้ตั้งแต่แรก

เกี่ยวกับสิ่งที่ใกล้เคียงที่สุดที่คุณสามารถทำได้คือส่งต่อแพ็กเก็ตการซิงโครไนซ์ดั้งเดิมไปยังเซิร์ฟเวอร์เงาของคุณจากนั้นตั้งค่าเกตเวย์เริ่มต้นสำหรับกล่องเหล่านั้นเป็นตำแหน่งที่ไม่มีอยู่จริง จากนั้นเมื่อใดก็ตามที่ผู้ใช้จะพยายามตั้งค่าการเชื่อมต่อพวกเขาจะได้รับเซิร์ฟเวอร์จริงในเครือข่ายของคุณและอย่างน้อยที่สุดคุณจะส่งแพ็กเก็ต syn ไปยังเครือข่ายเงา Darn ตอนนี้คุณมีฉันสงสัยว่าคุณสามารถทำให้งานนี้ด้วย :)


1

ฉันสามารถถาม@adriancoเกี่ยวกับเรื่องนี้ได้ที่การพบปะ Netflix

คำตอบก็คือพวกเขาเขียนเครื่องมือของตัวเองซึ่งโดยทั่วไปแล้วจะเป็น ServletFilter (ขออภัยคำศัพท์เฉพาะของ Java) ที่สร้างคำขอปัจจุบันขึ้นมาใหม่

ประโยชน์คือ:

  • รูปแบบการเข้าชม 'โลกแห่งความจริง' กับโครงสร้างพื้นฐานการทดสอบ ("มืด") ของคุณ
  • ไม่จำเป็นต้องบันทึกและเล่นซ้ำ

ข้อเสียเปรียบ:

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