Facebook เปิดตัวแพตช์ที่ปรับปรุงตัวควบคุมหน่วยความจำ Slab ใน Linux

Romano Gushchin (วิศวกรซอฟต์แวร์ของ Facebook) ได้ส่งชุดแพตช์สำหรับแอปพลิเคชันการจัดสรรหน่วยความจำของไดรเวอร์สแลบ (ตัวควบคุมหน่วยความจำ) ไปยังรายชื่อผู้รับจดหมายสำหรับการพัฒนาเคอร์เนล Linux

ไดรเวอร์ตัวใหม่นี้มีความโดดเด่นตรงที่ย้ายการจัดการสแล็บจากระดับหน้าหน่วยความจำไปสู่ระดับอ็อบเจ็กต์เคอร์เนล ทำให้สามารถใช้หน้าสแล็บร่วมกันระหว่างกลุ่ม c ต่างๆ ได้ แทนที่จะจัดสรรแคชสแล็บแยกต่างหากสำหรับแต่ละกลุ่ม c

Roman พบสิ่งที่เขาเรียกว่า "ข้อบกพร่องที่ร้ายแรงมาก" ในตัวควบคุมหน่วยความจำแผ่นพื้นที่มีอยู่ซึ่งนำไปสู่การใช้ประโยชน์ต่ำในทุกวันนี้ด้วย cgroups

“ เหตุผลที่แท้จริงว่าทำไมการออกแบบที่มีอยู่จึงนำไปสู่การใช้งานพื้นได้ต่ำนั้นง่ายมาก: หน้าพื้นจะถูกใช้โดยพูลหน่วยความจำโดยเฉพาะ

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

หากปิดใช้งานการบัญชี kmem เคอร์เนลสามารถใช้พื้นที่ว่างบนหน้าพื้นสำหรับการจัดสรรอื่น ๆ «

ตัวควบคุมหน่วยความจำแบบ Slabที่ Romano Gushchin เสนอเมื่อปีที่แล้วนั้นค่อนข้างน่าสนใจ เนื่องจากช่วยเพิ่มประสิทธิภาพในการใช้งาน Slab ลดขนาดหน่วยความจำที่ใช้สำหรับ Slab ลง 30-45% และลดการใช้หน่วยความจำโดยรวมของแกนประมวลผลลงอย่างมาก

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

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

cgroups ทั้งหมดสำหรับหน่วยความจำในการนำไปใช้งานใหม่ใช้ชุดแคชของ slab ทั่วไปและอายุการใช้งานของแคช slab จะไม่เชื่อมโยงกับอายุการใช้งานของข้อ จำกัด หน่วยความจำที่กำหนดผ่าน cgroup อีกต่อไป

การบัญชีทรัพยากรที่แม่นยำยิ่งขึ้นที่นำมาใช้ในตัวควบคุมแผ่นพื้นใหม่ในทางทฤษฎีควรโหลด CPU มากขึ้น แต่ในทางปฏิบัติความแตกต่างกลับกลายเป็นเรื่องเล็กน้อย

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

แพตช์นี้ประกอบด้วยชิ้นส่วนกึ่งอิสระสองสามส่วนซึ่งสามารถค้นหาการใช้งานนอกตัวควบคุมหน่วยความจำของแผ่นพื้น:

  • Subpage Load API ซึ่งสามารถใช้ในอนาคตเพื่อนับวัตถุอื่น ๆ ที่ไม่ใช่ขนาดของเพจตัวอย่างเช่นการจัดสรร percpu
  • mem_cgroup_ptr API ที่พอยน์เตอร์นับเป็น memcg สามารถนำมาใช้ซ้ำเพื่อการจัดเรียงวัตถุอื่น ๆ อย่างมีประสิทธิภาพเช่น pagecache

ในขณะเดียวกันการใช้หน่วยความจำก็ลดลงอย่างเห็นได้ชัด : ในบางเครื่องสามารถประหยัดหน่วยความจำได้มากถึง 1 GB แต่ตัวเลขนี้ขึ้นอยู่กับลักษณะของภาระงานขนาดโดยรวมของ RAM จำนวน CPU และลักษณะการทำงานของหน่วยความจำเป็น อย่างมาก

แทนที่จะสร้างชุด kmem_caches แยกต่างหากสำหรับ cgroup หน่วยความจำแต่ละชุดจะใช้ชุดโกลบอลสองชุด: ชุด root สำหรับการกำหนด cgroup ที่ไม่ได้นับและ root set และชุดที่สองสำหรับการกำหนดอื่น ๆ ทั้งหมด สิ่งนี้ช่วยให้การจัดการอายุการใช้งานของ kmem_caches แต่ละรายการทำได้ง่ายขึ้น

สุดท้ายนี้ หากคุณสนใจเรียนรู้เกี่ยวกับชุดแพทช์ใหม่ 19 รายการ คุณสามารถค้นหาได้ใน รายชื่อผู้รับจดหมาย ของเคอร์เนล


เพิ่มเป็นแหล่งข้อมูลที่ต้องการใน Google