อินโก โมลนาร์, ผู้พัฒนาเคอร์เนล Linux ที่รู้จักกันดีและ ผู้เขียน CFS Task Scheduler เสนอให้รายชื่อส่งเมลสำหรับการพัฒนาเคอร์เนล Linux อภิปรายเกี่ยวกับแพตช์จำนวนหนึ่ง ซึ่งส่งผลกระทบมากกว่าครึ่งหนึ่งของไฟล์ทั้งหมดในแหล่งเคอร์เนลและให้ความเร็วในการสร้างเคอร์เนลโดยรวมเพิ่มขึ้น 50 -80% ขึ้นอยู่กับการกำหนดค่า
การเพิ่มประสิทธิภาพดำเนินการ โดดเด่นตรงที่มันเกี่ยวข้องกับการเพิ่มชุดการแก้ไขที่ใหญ่ที่สุด ในประวัติศาสตร์ของการพัฒนาเคอร์เนล: พวกเขาเริ่มที่จะรวมแพตช์ 2297 รายการพร้อมกัน เปลี่ยนไฟล์มากกว่า 25 ไฟล์
ประสิทธิภาพที่เพิ่มขึ้น ทำได้โดยการเปลี่ยนวิธีการจัดการไฟล์ส่วนหัว. ควรสังเกตว่าในช่วงสามสิบปีของการพัฒนาเคอร์เนล สถานะของไฟล์ส่วนหัวได้ลดลงเนื่องจากการมีอยู่ของการพึ่งพาข้ามกันจำนวนมากระหว่างไฟล์
การปรับโครงสร้างของไฟล์ส่วนหัวใช้เวลานานกว่าหนึ่งปีและ จำเป็นต้องมีการออกแบบลำดับชั้นและการพึ่งพาใหม่อย่างมีนัยสำคัญ. ในระหว่างการปรับโครงสร้างใหม่ ได้มีการดำเนินการเพื่อแยกคำจำกัดความประเภทและ API สำหรับระบบย่อยเคอร์เนลต่างๆ
ฉันยินดีที่จะประกาศเวอร์ชันสาธารณะครั้งแรกของโปรเจ็กต์ "Fast Kernel Headers" ใหม่ของฉัน ที่ฉันทำงานอยู่ตั้งแต่ปลายปี 2020 ซึ่งเป็นการปรับปรุงการทำงานใหม่อย่างครอบคลุมของลำดับชั้นของส่วนหัวของเคอร์เนล Linux และการพึ่งพาส่วนหัว โดยมีจุดประสงค์สองประการคือ:
- เร่งความเร็วการสร้างเคอร์เนล (ทั้งเวลาการสร้างแบบสัมบูรณ์และแบบส่วนเพิ่ม)
- พิมพ์การแยกระบบย่อยและคำจำกัดความ API จากกันและกัน
ตามที่นักพัฒนาเคอร์เนลส่วนใหญ่ทราบ มีส่วนหัว .h หลักประมาณ 10,000 รายการในเคอร์เนล Linux ในลำดับชั้นการรวม / และ arch / * / รวม / ลำดับชั้น กว่า 30 ปีที่ผ่านมา พวกเขาได้พัฒนาเป็นชุดของการพึ่งพาอาศัยกันที่ซับซ้อนและเจ็บปวดซึ่งเราเรียกอย่างเสน่หา 'Dependency Hell'
ท่ามกลางการเปลี่ยนแปลงที่ทำคือ: การแยกไฟล์ส่วนหัวระดับสูงออกจากกัน การยกเว้นฟังก์ชันอินไลน์ที่ลิงก์ไฟล์ส่วนหัว การแมปไฟล์ส่วนหัวสำหรับประเภทและ API การจัดหาชุดไฟล์ส่วนหัวแยกต่างหาก (ไฟล์ประมาณ 80 ไฟล์มีการขึ้นต่อกันทางอ้อมที่รบกวนการประกอบ เปิดเผยผ่านไฟล์ส่วนหัวของไฟล์อื่นๆ) การเพิ่มการพึ่งพาโดยอัตโนมัติไปยัง ไฟล์ ".h" และ ".c" การปรับให้เหมาะสมทีละขั้นตอนของไฟล์ส่วนหัว การใช้โหมด "CONFIG_KALLSYMS_FAST = y" การเลือกการรวมไฟล์ C ลงในบล็อกการประกอบเพื่อลดจำนวนไฟล์อ็อบเจ็กต์
เป็นผลให้ งานที่ทำได้รับอนุญาตให้ลดขนาดของไฟล์ส่วนหัวที่ประมวลผลได้ในขั้นตอนหลังการประมวลผล 1-2 ลำดับความสำคัญ
- ตัวอย่างเช่น ก่อนการปรับให้เหมาะสม การใช้ไฟล์ส่วนหัว "linux / gfp.h" ส่งผลให้มีการเพิ่มโค้ด 13543 บรรทัด และการรวมไฟล์ส่วนหัวที่ขึ้นต่อกัน 303 ไฟล์ และหลังจากการเพิ่มประสิทธิภาพ ขนาดก็ลดลงเหลือ 181 บรรทัดและ 26 ไฟล์ขึ้นต่อกัน
- อีกตัวอย่างหนึ่ง: การประมวลผลไฟล์ "kernel / pid.c" ที่ยังไม่ได้แพตช์ล่วงหน้าจะเชื่อมต่อโค้ด 94 บรรทัด ซึ่งส่วนใหญ่ไม่ได้ใช้ใน pid.c การแยกไฟล์ส่วนหัวทำให้เราสามารถลดจำนวนโค้ดที่ประมวลผลได้สามครั้ง ทำให้จำนวนบรรทัดที่ประมวลผลลดลงเหลือ 36 รายการ
เมื่อเคอร์เนลถูกสร้างขึ้นใหม่ทั้งหมดด้วยคำสั่ง "make -j96 vmlinux" บนระบบทดสอบ การแพตช์แสดงให้เห็นการลดเวลาในการคอมไพล์ของสาขา v5.16-rc7 จาก 231,34 เป็น 129,97, 15,5 วินาที (จาก 27,7 เป็น XNUMX บิลด์ต่อ ชั่วโมง) และยังเพิ่มประสิทธิภาพการใช้งานคอร์ CPU ระหว่างการสร้างอีกด้วย
ด้วยการคอมไพล์แบบเพิ่มหน่วย เอฟเฟกต์การปรับให้เหมาะสมจะเห็นได้ชัดเจนยิ่งขึ้น: เวลาในการสร้างเคอร์เนลใหม่หลังจากทำการเปลี่ยนแปลงไฟล์ส่วนหัวลดลงอย่างมาก (จาก 112% เป็น 173% ขึ้นอยู่กับไฟล์ส่วนหัวที่เปลี่ยนแปลง)
ปัจจุบันการเพิ่มประสิทธิภาพพร้อมใช้งานสำหรับสถาปัตยกรรม ARM64, MIPS, Sparc และ x86 (32 บิตและ 64 บิต) เท่านั้น
อย่างประณีต หากคุณสนใจที่จะทราบข้อมูลเพิ่มเติมคุณสามารถตรวจสอบรายละเอียดได้ในไฟล์ ลิงค์ต่อไปนี้