ในโลกของโครงสร้างพื้นฐานคลาวด์ ความไม่มีประสิทธิภาพเล็กน้อยสามารถขยาย規模จนกลายเป็นการใช้ทรัพยากรจำนวนมหาศาล การสอบสวนทางเทคนิคล่าสุดเปิดเผยว่าปัญหาการกำหนดค่าเล็กน้อยที่ดูเหมือนไม่สำคัญกับ label ของ namespace ใน Kubernetes daemonsets กำลังใช้หน่วยความจำหลายเทระไบต์ทั่วการปรับใช้ขนาดใหญ่ การค้นพบนี้ได้จุดประกายการอภิปรายในวงกว้างเกี่ยวกับแนวปฏิบัติในการเพิ่มประสิทธิภาพ ความรับผิดชอบของนักพัฒนา และต้นทุนที่ซ่อนอยู่ของเครื่องมือโครงสร้างพื้นฐานสมัยใหม่
![]() |
|---|
| ภาพหน้าจอของบล็อกโพสต์ที่มีหัวข้อว่า "How We Found 7 TiB of Memory Just Sitting Around" ซึ่งเน้นการสืบสวนทางเทคนิคเกี่ยวกับความไม่มีประสิทธิภาพของหน่วยความจำใน Kubernetes |
การสอบสวนหน่วยความจำที่เปิดเผยทรัพยากรที่สูญเสียไป
การเดินทางเพื่อเพิ่มประสิทธิภาพหน่วยความจำเริ่มต้นขึ้นเมื่อวิศวกรสังเกตเห็นว่า daemonset การบันทึก日志 Vector ของพวกเขาใช้หน่วยความจำมากกว่าที่คาดไว้อย่างมีนัยสำคัญ สิ่งที่เริ่มต้นจากการตรวจสอบประสิทธิภาพตามปกติกลับพบผู้ร้ายที่ไม่คาดคิด: label ของ namespace ที่ถูกเก็บรวบรวมแต่แทบไม่เคยถูกใช้ การสอบสวนเปิดเผยว่าเพียงแค่ปิดการเก็บรวบรวม label ของ namespace ที่ไม่จำเป็น ก็ลดการใช้หน่วยความจำลง 50 เปอร์เซ็นต์ในโครงสร้างพื้นฐานการบันทึก日志ของพวกเขา
ผู้แสดงความคิดเห็นหนึ่งคนสะท้อนความประหลาดใจของชุมชนต่อ规模ของสิ่งที่สูญเสียไป: ฉันต้องสงสัยว่า มีใครเคยคิดบ้างไหมว่ามันสมเหตุสมผลแล้วหรือที่คลัสเตอร์ที่ดูเหมือนต้องการหน่วยความจำเพียง 120GB กำลังใช้ถึง 1.2TB เพียงเพื่อการบันทึก日志? ความรู้สึกนี้สะท้อนให้เห็นว่าความไม่มีประสิทธิภาพของทรัพยากรสามารถสะสมได้อย่างง่ายดายโดยไม่ถูกสังเกตเห็นในระบบกระจายที่ซับซ้อน
ผลลัพธ์หลักจากการปรับปรุง:
- การลดการใช้หน่วยความจำ: 50% ต่อ Vector daemonset instance
- หน่วยความจำทั้งหมดที่กู้คืนได้: 7 TiB ทั่วทั้งโครงสร้างพื้นฐาน
- สาเหตุหลัก: การรวบรวม label ของ Kubernetes namespace ที่ไม่จำเป็น
- วิธีแก้ไข: เปลี่ยนแปลงการตั้งค่าเพื่อปิดการประมวลผล label ที่ไม่ได้ใช้งาน
![]() |
|---|
| ผลการวิเคราะห์หน่วยความจำที่แสดงการใช้หน่วยความจำที่ไม่คาดคิด ซึ่งนำไปสู่การค้นพบความไม่มีประสิทธิภาพในโครงสร้างพื้นฐานการบันทึกข้อมูล |
ปัญหาในวงกว้างของจุดบอดในโครงสร้างพื้นฐาน
การกู้คืนหน่วยความจำ 7TiB นี้เน้นย้ำถึงความท้าทายทั่วไปในสภาพแวดล้อม DevOps สมัยใหม่ เมื่อองค์กรขยาย规模 ความไม่มีประสิทธิภาพเล็กน้อยก็กลายเป็นการใช้ทรัพยากรครั้งใหญ่ การอภิปรายเปิดเผยเรื่องราวที่คล้ายกัน across อุตสาหกรรม ตั้งแต่การปรับใช้ฐานข้อมูลที่มีขนาดใหญ่เกินไปไปจนถึงนโยบายการปรับขนาดอัตโนมัติที่กำหนดค่าไม่ถูกต้อง วิศวกรคนหนึ่งแบ่งปันการค้นพบ subscription ซึ่งกำลังเรียกใช้เซิร์ฟเวอร์ MSSQL 7 เครื่องสำหรับฐานข้อมูล 12 ฐานข้อมูล แม้องค์กรจะมี controls คลาวด์ที่เข้มงวด
บทสนทนาเปลี่ยนไปสู่สาเหตุที่ความไม่มีประสิทธิภาพที่เห็นได้ชัดเช่นนี้ยังคงมีอยู่ บางคนระบุว่าเป็นเพราะนักพัฒนาเลี่ยงความรับผิดชอบในการดำเนินงาน ในขณะที่บางคนชี้ให้เห็นถึงการเติบโตของทรัพยากรอย่างช้าๆ ที่ปกปิดปัญหาจนกว่าปัญหาจะรุนแรง up ตามที่ผู้เขียนต้นฉบับบันทึกไว้ คุณจะประหลาดใจกับสิ่งที่คุณไม่สังเกตเห็นเมื่อมีโหนดมากพอและการเติบโตของทรัพยากรที่ช้าพอเมื่อเวลาผ่านไป
รูปแบบการสิ้นเปลืองทรัพยากรโครงสร้างพื้นฐานที่พบบ่อย:
- database instances ที่มีขนาดใหญ่เกินความจำเป็น (เซิร์ฟเวอร์ MSSQL 7 ตัวสำหรับ database 12 ตัว)
- นโยบาย auto-scaling ที่ตั้งค่าผิดพลาด
- Kubernetes operators ที่ไม่ได้รับการปรับแต่งให้เหมาะสม
- การตั้งค่าเริ่มต้นที่ไม่ได้ปรับแต่งให้รองรับการขยายตัว
- การเติบโตของทรัพยากรอย่างค่อยเป็นค่อยไปที่ปิดบังความไร้ประสิทธิภาพ
ความคาดหวังด้านประสิทธิภาพและวัฒนธรรมทางวิศวกรรม
เหตุการณ์นี้จุดประกายการอภิปรายที่ลึกซึ้งยิ่งขึ้นเกี่ยวกับวัฒนธรรมประสิทธิภาพในการพัฒนาซอฟต์แวร์ หลายคนแย้งว่านักพัฒนาสมัยใหม่ยอมรับประสิทธิภาพที่ต่ำเกินไป ล้มเหลวในการรับรู้ว่าคอมพิวเตอร์ควรสามารถทำงานได้เร็วแค่ไหน ตามที่ผู้แสดงความคิดเห็นหนึ่งคนระบุ แนวคิดที่ใครๆ จะยอมรับคำขอไปยังเว็บไซต์ที่ใช้เวลานานกว่า 30ms นั้นบ้าไปแล้ว และไม่มีใครควรยอมรับมันจริงๆ แต่เรามักทำกันทั่วไป
สิ่งนี้เชื่อมโยงกับ主题ที่กว้างขึ้นเกี่ยวกับลำดับความสำคัญทางวิศวกรรมและการวิเคราะห์ต้นทุนและผลประโยชน์ ผู้แสดงความคิดเห็นหลายคนระบุว่าความพยายามในการเพิ่มประสิทธิภาพมักแข่งขันกับการพัฒนา features และธุรกิจต้องปรับสมดุลระหว่างเวลาของวิศวกรกับการประหยัดที่อาจเกิดขึ้น อย่างไรก็ตาม การกู้คืน 7TiB สาธิตให้เห็นว่าการเพิ่มประสิทธิภาพบางอย่างให้ผลตอบแทนมหาศาลด้วยการเปลี่ยนแปลงโค้ดเพียงเล็กน้อย
![]() |
|---|
| กราฟแสดงการใช้หน่วยความจำตามช่วงเวลา แสดงให้เห็นการลดลงอย่างมีนัยสำคัญของการใช้หน่วยความจำหลังจากความพยายามในการปรับปรุงประสิทธิภาพ |
โซลูชันทางเทคนิคและข้อพิจารณาด้านสถาปัตยกรรม
การอภิปรายได้สำรวจแนวทางทางเทคนิคต่างๆ ในการป้องกันปัญหาที่คล้ายกัน บางคนแนะนำสถาปัตยกรรมทางเลือก เช่น การรันอินสแตนซ์ Vector ต่อ namespace แทนที่จะเป็น daemonsets แม้ว่าสิ่งนี้จะนำมาซึ่งความท้าทายอื่นๆ เช่น โหลดเครือข่ายที่เพิ่มขึ้น บางคนตั้งคำถามว่าสามารถเพิ่มประสิทธิภาพ Kubernetes API ต้นทางเพื่อลดค่าโสหุ้ยของหน่วยความจำจากการดำเนินการ list-watch บน namespaces หรือไม่
บทสนทนาเน้นย้ำให้เห็นว่าแพตเทิร์นตัวดำเนินการ Kubernetes มาตรฐาน—การปรับสถานะคลัสเตอร์ให้สอดคล้องกับ specifications อย่างต่อเนื่อง—สามารถนำไปสู่การใช้ทรัพยากรแบบต่อเนื่องเมื่อไม่ได้ปรับแต่งอย่างระมัดระวัง สิ่งนี้ทำให้ตระหนักมากขึ้นว่าตัวดำเนินการจำเป็นต้องมีการปรับแต่งอย่างละเอียดสำหรับความต้องการ scale เฉพาะ แทนที่จะใช้การกำหนดค่าเริ่มต้น
เรื่องราวการเพิ่มประสิทธิภาพหน่วยความจำนี้เป็นเครื่องเตือนใจว่าในระบบกระจาย ตัวเลือกการกำหนดค่าเล็กๆ สามารถส่งผลกระทบอย่างมหาศาลในระดับ scale มันเน้นย้ำถึงความสำคัญของการตรวจสอบประสิทธิภาพอย่างต่อเนื่อง การตั้งคำถามกับสมมติฐานเริ่มต้น และการรักษาสิ่งที่ผู้แสดงความคิดเห็นคนหนึ่งเรียกว่า ประสิทธิผลที่ไม่มีเหตุผลของการสร้างประวัติและขุดลึก เมื่อโครงสร้างพื้นฐานยังคงขยาย规模 แนวปฏิบัติเหล่านี้ก็มีความสำคัญมากขึ้นเรื่อยๆ สำหรับทั้งการควบคุมต้นทุนและความน่าเชื่อถือของระบบ



