สภาพเครือข่ายข้อมูลแย่งจากนรก
ฉันกำลังเขียนไคลเอนต์เครือข่าย / เซิร์ฟเวอร์ (Windows XP / C #) เพื่อทำงานกับแอปพลิเคชันที่คล้ายกันบนเวิร์กสเตชันเก่า (Encore 32/77) ที่เขียนโดยนักพัฒนาคนอื่น
สิ่งที่แอปพลิเคชันทำคือการแบ่งปัน / จัดการข้อมูลบางอย่างบนโฮสต์เพื่อควบคุมกระบวนการโฮสต์ที่ใช้ระบบด้วย UI หน้าจอสัมผัสหลายหน้าจอที่ใช้พีซีแฟนซี
มันทำอย่างนี้กับโครงสร้าง 3 ชั้น กระบวนการสื่อสารข้อมูลอ่าน / เขียนข้อมูลไปยัง / จากโฮสต์ทำการแปลงรูปแบบที่จำเป็นทั้งหมด (endianness, รูปแบบจุดลอยตัว, ฯลฯ ) และเขียน / อ่านค่าไปยัง / จากฐานข้อมูล ฐานข้อมูลทำหน้าที่เป็นตัวกลางข้อมูลระหว่าง comms และ touchscreen UIs แอพของ touchscreen UI สร้างหน้าจอสัมผัสขึ้นอยู่กับจำนวนจอภาพที่ต่อกับ PC (ตรวจพบสิ่งนี้โดยอัตโนมัติ)
ในกรอบเวลาที่กำหนดแพ็คเก็ตของค่าระหว่างโฮสต์และพีซีของเราสามารถส่งค่าสูงสุด 128 ข้ามสายในเวลาที่มีเวลาแฝงสูงสุดของ ~ 110ms ต่อการเดินทางรอบ (UDP ถูกใช้กับการเชื่อมต่ออีเธอร์เน็ตโดยตรง x-over ระหว่าง คอมพิวเตอร์). ดังนั้นจำนวนของตัวแปรที่อนุญาตตามจำนวนตัวแปรของหน้าจอสัมผัสที่แนบมาจึงอยู่ภายใต้การควบคุมอย่างเข้มงวด นอกจากนี้โฮสต์ (แม้ว่าจะมีสถาปัตยกรรมมัลติโปรเซสเซอร์ที่ซับซ้อนพร้อมบัสหน่วยความจำที่ใช้สำหรับการคำนวณแบบเรียลไทม์) มีพลังการประมวลผลประมาณ 1 / 100th ของโทรศัพท์มือถือของฉันดังนั้นมันจึงมอบหมายให้ทำการประมวลผลน้อยที่สุดเท่าที่เป็นไปได้ / ลูกค้าจะต้องเขียนในการชุมนุมเพื่อให้มั่นใจว่านี้ (โฮสต์กำลังทำงานแบบจำลองเรียลไทม์เต็มรูปแบบที่ไม่ได้รับผลกระทบจากโปรแกรมของเรา)
ปัญหาคือ ค่าบางค่าเมื่อเปลี่ยนบนหน้าจอสัมผัสจะไม่ใช้เพียงค่าที่ป้อนใหม่ แต่จะวนรอบแบบสุ่มระหว่างค่านั้นกับค่าก่อนหน้า ค่านั้นมีเพียงค่าไม่กี่ค่าในหน้าเฉพาะบางหน้าเท่านั้นที่มีการรวมกันของหน้าเว็บที่เคยแสดงอาการ เราเกือบจะพลาดปัญหาจนครบถ้วนจนกว่าเราจะเริ่มดำเนินการผ่านขั้นตอนการตอบรับลูกค้าครั้งแรก
ในการปักหมุดปัญหาฉันเลือกหนึ่งในค่าการสั่น:
- ฉันตรวจสอบแอพ Touchscreen แล้วมันสั่น
- ฉันตรวจสอบฐานข้อมูลแล้วสั่น
- ฉันตรวจสอบแอพที่กำลังสั่นอยู่
จากนั้นฉันก็แยกออก wireshark และเริ่มถอดรหัสการจับแพ็คเก็ตด้วยตนเอง ผล:
- ไม่สั่น แต่แพ็กเก็ตไม่ถูกต้องมีข้อมูลมากเกินไป
ฉันก้าวผ่านทุกรายละเอียดของรหัส comms ร้อยครั้งเพื่อหาข้อบกพร่อง / ข้อผิดพลาด
ในที่สุดฉันก็เริ่มส่งอีเมลไปยังผู้พัฒนารายอื่นถามรายละเอียดว่าจุดจบของเขาทำงานได้อย่างไรเพื่อดูว่ามีบางสิ่งที่ฉันขาดหายไปหรือไม่ จากนั้นฉันก็พบว่า
เห็นได้ชัดว่าเมื่อเขาส่งข้อมูลเขาไม่ได้ล้างอาเรย์ของข้อมูลก่อนการส่งดังนั้นโดยพื้นฐานแล้วเขาเขียนทับบัฟเฟอร์สุดท้ายที่ใช้กับค่าใหม่ที่เขียนทับค่าเก่า แต่ค่าเก่าที่ยังไม่ถูกเขียนทับยังคงถูกส่งไป
ดังนั้นหากค่าอยู่ที่ตำแหน่ง 80 ของ data array และรายการของค่าที่ร้องขอเปลี่ยนเป็นน้อยกว่า 80 แต่มีค่าเดียวกันนั้นอยู่ในรายการใหม่ค่าทั้งสองจะมีอยู่ใน data buffer สำหรับบัฟเฟอร์เฉพาะที่ใด ๆ เวลาที่กำหนด
ค่าที่อ่านจากฐานข้อมูลขึ้นอยู่กับการแบ่งเวลาของเวลาที่ UI กำลังร้องขอค่า
การแก้ไขนั้นง่ายอย่างเจ็บปวด อ่านในจำนวนรายการที่เข้ามาในบัฟเฟอร์ข้อมูล (จริง ๆ แล้วมันมีอยู่เป็นส่วนหนึ่งของโปรโตคอลแพ็คเก็ต) และอย่าอ่านบัฟเฟอร์เกินจำนวนรายการนั้น
บทเรียนที่ได้เรียนรู้:
อย่าใช้พลังการคำนวณที่ทันสมัย มีบางครั้งที่คอมพิวเตอร์ไม่รองรับอีเธอร์เน็ตและเมื่อล้างอาเรย์อาจถือว่ามีราคาแพง หากคุณต้องการดูว่าเรามาไกลแค่ไหนลองจินตนาการถึงระบบที่ไม่มีการจัดสรรหน่วยความจำแบบไดนามิก IE กระบวนการผู้บริหารจะต้องจัดสรรหน่วยความจำทั้งหมดล่วงหน้าสำหรับโปรแกรมทั้งหมดตามลำดับและไม่มีโปรแกรมใดที่สามารถเติบโตเกินขอบเขตนั้นได้ IE การจัดสรรหน่วยความจำเพิ่มเติมให้กับโปรแกรมโดยไม่ต้องคอมไพล์ซ้ำทั้งระบบอาจทำให้เกิดความผิดพลาดครั้งใหญ่ ฉันสงสัยว่าผู้คนจะพูดถึงวันเก็บขยะล่วงหน้าในวันเดียวกันหรือไม่
เมื่อทำการเชื่อมต่อเครือข่ายด้วยโปรโตคอลที่กำหนดเอง (หรือการจัดการการแสดงข้อมูลไบนารีโดยทั่วไป) ให้แน่ใจว่าคุณอ่านข้อมูลจำเพาะจนกว่าคุณจะเข้าใจทุกฟังก์ชั่นของทุกค่าที่ส่งผ่านไปป์ ฉันหมายถึงอ่านมันจนกว่าดวงตาของคุณจะเจ็บปวด ผู้คนจัดการข้อมูลโดยจัดการบิตหรือไบต์แต่ละตัวมีวิธีที่ชาญฉลาดและมีประสิทธิภาพในการทำสิ่งต่าง ๆ รายละเอียดที่เล็กที่สุดอาจทำให้ระบบพัง
เวลาโดยรวมในการแก้ไขคือ 2-3 วันโดยส่วนใหญ่นั้นใช้เวลาทำงานอย่างอื่นเมื่อฉันต้องผิดหวังกับสิ่งนี้
SideNote: คอมพิวเตอร์แม่ข่ายที่เป็นปัญหาไม่รองรับอีเธอร์เน็ตตามค่าเริ่มต้น การ์ดที่ใช้ขับเคลื่อนนั้นทำขึ้นเองและดัดแปลงและโปรโตคอลสแต็คแทบไม่มีอยู่จริง นักพัฒนาที่ฉันทำงานด้วยนั้นเป็นหนึ่งในโปรแกรมเมอร์เขาไม่เพียง แต่นำ UDP รุ่นที่ถูกถอดออกและสแต็กอีเทอร์เน็ตปลอมที่มีขนาดเล็กที่สุด (ตัวประมวลผลไม่มีประสิทธิภาพเพียงพอที่จะรองรับสแต็กอีเธอร์เน็ตแบบเต็ม) บนระบบสำหรับโครงการนี้ แต่เขาทำมันในเวลาน้อยกว่าหนึ่งสัปดาห์ เขายังเป็นหนึ่งในหัวหน้าทีมโครงการดั้งเดิมที่ออกแบบและตั้งโปรแกรมระบบปฏิบัติการตั้งแต่แรก ให้พูดอะไรก็ได้ที่เขาเคยมีส่วนร่วมเกี่ยวกับคอมพิวเตอร์ / การเขียนโปรแกรม / สถาปัตยกรรมไม่ว่านานแค่ไหนหรือนานแค่ไหนที่ฉันใหม่แล้วฉันจะฟังทุกคำ