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 รายการ คุณสามารถค้นหาได้ใน รายชื่อผู้รับจดหมาย ของเคอร์เนล