Fast Kernel Headers ชุดของแพตช์ที่เร่งการคอมไพล์เคอร์เนล 50-80%

อินโก โมลนาร์, ผู้พัฒนาเคอร์เนล 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 บิต) เท่านั้น

อย่างประณีต หากคุณสนใจที่จะทราบข้อมูลเพิ่มเติมคุณสามารถตรวจสอบรายละเอียดได้ในไฟล์ ลิงค์ต่อไปนี้


แสดงความคิดเห็นของคุณ

อีเมล์ของคุณจะไม่ถูกเผยแพร่ ช่องที่ต้องการถูกทำเครื่องหมายด้วย *

*

*

  1. ผู้รับผิดชอบข้อมูล: Miguel ÁngelGatón
  2. วัตถุประสงค์ของข้อมูล: ควบคุมสแปมการจัดการความคิดเห็น
  3. ถูกต้องตามกฎหมาย: ความยินยอมของคุณ
  4. การสื่อสารข้อมูล: ข้อมูลจะไม่ถูกสื่อสารไปยังบุคคลที่สามยกเว้นตามข้อผูกพันทางกฎหมาย
  5. การจัดเก็บข้อมูล: ฐานข้อมูลที่โฮสต์โดย Occentus Networks (EU)
  6. สิทธิ์: คุณสามารถ จำกัด กู้คืนและลบข้อมูลของคุณได้ตลอดเวลา