ข่าวสารเกี่ยวกับผลิตภัณฑ์

การเพิ่มประสิทธิภาพ Android: ขอแนะนำ AutoFDO สำหรับเคอร์เนล

ใช้เวลาอ่าน 4 นาที
ดูโปรไฟล์ของ Charles Munger
Yabin Cui วิศวกรซอฟต์แวร์

เราคือทีม Android LLVM Toolchain สิ่งสำคัญอันดับต้นๆ ของเราคือการปรับปรุงประสิทธิภาพของ Android ผ่านเทคนิคการเพิ่มประสิทธิภาพในระบบนิเวศ LLVM เราพยายามหาวิธีทำให้ Android ทำงานได้เร็วขึ้น ราบรื่นขึ้น และมีประสิทธิภาพมากขึ้นอยู่เสมอ แม้ว่างานเพิ่มประสิทธิภาพส่วนใหญ่จะเกิดขึ้นในพื้นที่ผู้ใช้ แต่เคอร์เนลยังคงเป็นหัวใจสำคัญของระบบ วันนี้เรายินดีที่จะแชร์วิธีที่เรานำการเพิ่มประสิทธิภาพโดยอัตโนมัติที่อิงตามความคิดเห็น (AutoFDO) มาใช้กับเคอร์เนล Android เพื่อมอบประสิทธิภาพที่ดียิ่งขึ้นอย่างมากให้แก่ผู้ใช้

AutoFDO คืออะไร

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

AutoFDO จะเปลี่ยนสิ่งนี้โดยใช้รูปแบบการเรียกใช้ในชีวิตจริงเพื่อเป็นแนวทางให้คอมไพเลอร์ รูปแบบเหล่านี้แสดงเส้นทางการดำเนินการตามคำสั่งที่พบบ่อยที่สุดที่โค้ดใช้ในระหว่างการใช้งานจริง ซึ่งบันทึกโดยการบันทึกประวัติการแยกสาขาของ CPU แม้ว่าข้อมูลนี้จะรวบรวมได้จากอุปกรณ์ในกลุ่ม แต่สำหรับเคอร์เนล เราจะสังเคราะห์ข้อมูลในสภาพแวดล้อมของห้องปฏิบัติการโดยใช้ภาระงานที่เป็นตัวแทน เช่น การเรียกใช้แอปยอดนิยม 100 อันดับแรก เราใช้เครื่องมือสร้างโปรไฟล์แบบสุ่มเพื่อบันทึกข้อมูลนี้ โดยระบุว่าส่วนใดของโค้ดเป็น "ฮอต" (ใช้บ่อย) และส่วนใดเป็น "โคลด์" เมื่อเราสร้างเคอร์เนลใหม่ด้วยโปรไฟล์เหล่านี้ คอมไพเลอร์จะตัดสินใจเพิ่มประสิทธิภาพได้อย่างชาญฉลาดมากขึ้นโดยปรับให้เหมาะกับภาระงานจริงของ Android

หากต้องการทำความเข้าใจผลกระทบของการเพิ่มประสิทธิภาพนี้ โปรดพิจารณาข้อเท็จจริงที่สำคัญต่อไปนี้

  • ใน Android เคอร์เนลจะใช้เวลา CPU ประมาณ 40%
  • เราใช้ AutoFDO เพื่อเพิ่มประสิทธิภาพไฟล์ปฏิบัติการและไลบรารีแบบเนทีฟในพื้นที่ผู้ใช้อยู่แล้ว ซึ่งช่วยปรับปรุงการเปิดแอปแบบ Cold ได้ประมาณ 4% และลดเวลาเปิดเครื่องได้ 1%

ประสิทธิภาพที่เพิ่มขึ้นในสถานการณ์จริง

เราได้เห็นการปรับปรุงที่น่าประทับใจในเมตริก Android ที่สำคัญโดยใช้ประโยชน์จากโปรไฟล์จากสภาพแวดล้อมในห้องปฏิบัติการที่มีการควบคุม โปรไฟล์เหล่านี้รวบรวมโดยใช้การ Crawl และการเปิดแอป และวัดในอุปกรณ์ Pixel ในเคอร์เนล 6.1, 6.6 และ 6.12

การปรับปรุงที่เห็นได้ชัดที่สุดมีดังนี้ ดูรายละเอียดเกี่ยวกับโปรไฟล์ AutoFDO สำหรับเคอร์เนลเวอร์ชันเหล่านี้ได้ในที่เก็บเคอร์เนล Android ที่เกี่ยวข้องสำหรับเคอร์เนล android16-6.12 และ android15-6.6

boosting_2.png

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

วิธีการทำงาน: ไปป์ไลน์

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

boosting_3.png

ขั้นตอนที่ 1: การรวบรวมโปรไฟล์

แม้ว่าเราจะใช้กลุ่มทดสอบภายในเพื่อสร้างโปรไฟล์ไบนารีของพื้นที่ผู้ใช้ แต่เราได้เปลี่ยนไปใช้สภาพแวดล้อมห้องทดลองที่มีการควบคุมสำหรับ Generic Kernel Image (GKI) การแยกการทำโปรไฟล์ออกจากรอบการเผยแพร่อุปกรณ์ช่วยให้สามารถอัปเดตได้อย่างยืดหยุ่นและทันที โดยไม่ขึ้นอยู่กับเวอร์ชันเคอร์เนลที่ติดตั้งใช้งาน ที่สำคัญคือ การทดสอบยืนยันว่าข้อมูลที่ได้จากห้องปฏิบัติการนี้ช่วยเพิ่มประสิทธิภาพได้เทียบเท่ากับข้อมูลที่ได้จากกลุ่มยานพาหนะในโลกแห่งความเป็นจริง

  • เครื่องมือและสภาพแวดล้อม: เราแฟลชอุปกรณ์ทดสอบด้วยอิมเมจเคอร์เนลล่าสุดและใช้ simpleperf เพื่อบันทึกสตรีมการดำเนินการตามคำสั่ง กระบวนการนี้อาศัยความสามารถของฮาร์ดแวร์ในการบันทึกประวัติการแยกสาขา โดยเฉพาะการใช้  ARM Embedded Trace Extension (ETE) และ ARM Trace Buffer Extension (TRBE) ในอุปกรณ์ Pixel
  • ภาระงาน: เราสร้างภาระงานที่เป็นตัวแทนโดยใช้แอปยอดนิยม 100 อันดับแรกจากชุดเครื่องมือทดสอบความเข้ากันได้ของแอป Android (C-Suite) เรามุ่งเน้นที่สิ่งต่อไปนี้เพื่อบันทึกข้อมูลที่แม่นยำที่สุด
    • การเปิดแอป: การเพิ่มประสิทธิภาพเพื่อลดความล่าช้าที่ผู้ใช้เห็นได้ชัดที่สุด
    • การ Crawl แอปที่ขับเคลื่อนด้วย AI: การจำลองการโต้ตอบของผู้ใช้ที่ต่อเนื่องและมีการพัฒนา
    • การตรวจสอบทั้งระบบ: บันทึกไม่เพียงกิจกรรมของแอปที่ทำงานอยู่เบื้องหน้าเท่านั้น แต่ยังรวมถึงเวิร์กโหลดที่สำคัญในเบื้องหลังและการสื่อสารระหว่างกระบวนการด้วย
  • การตรวจสอบความถูกต้อง: ภาระงานที่สังเคราะห์ขึ้นนี้แสดงความคล้ายคลึงกัน 85% กับรูปแบบการดำเนินการที่รวบรวมจากกลุ่มภายในของเรา
  • ข้อมูลที่กำหนดเป้าหมาย: การทำซ้ำการทดสอบเหล่านี้อย่างเพียงพอช่วยให้เราบันทึกรูปแบบการดำเนินการที่มีความแม่นยำสูง ซึ่งแสดงถึงการโต้ตอบของผู้ใช้ในชีวิตจริงกับแอปพลิเคชันยอดนิยมได้อย่างถูกต้อง นอกจากนี้ เฟรมเวิร์กที่ขยายได้นี้ยังช่วยให้เราผสานรวมภาระงานและเกณฑ์มาตรฐานเพิ่มเติมได้อย่างราบรื่นเพื่อขยายความครอบคลุมของเรา

ขั้นตอนที่ 2: การประมวลผลโปรไฟล์

เราจะประมวลผลข้อมูลการติดตามดิบหลังการรวบรวมเพื่อให้มั่นใจว่าข้อมูลสะอาด มีประสิทธิภาพ และพร้อมสำหรับคอมไพเลอร์

  • การรวม: เรารวมข้อมูลจากการทดสอบหลายครั้งและอุปกรณ์หลายเครื่องไว้ในมุมมองระบบเดียว
  • การแปลง:  เราแปลงการติดตามดิบเป็นรูปแบบโปรไฟล์ AutoFDO โดยกรองสัญลักษณ์ที่ไม่ต้องการออกตามความจำเป็น
  • การตัดแต่งโปรไฟล์: เราตัดแต่งโปรไฟล์เพื่อนำข้อมูลสำหรับฟังก์ชัน "Cold" ออก ซึ่งจะช่วยให้ฟังก์ชันดังกล่าวใช้การเพิ่มประสิทธิภาพมาตรฐานได้ ซึ่งจะช่วยป้องกันการถดถอยในโค้ดที่ใช้ไม่บ่อยและหลีกเลี่ยงการเพิ่มขนาดไบนารีโดยไม่จำเป็น

ขั้นตอนที่ 3: การทดสอบโปรไฟล์

ก่อนการติดตั้งใช้งาน โปรไฟล์จะผ่านการตรวจสอบอย่างเข้มงวดเพื่อให้มั่นใจว่าโปรไฟล์จะช่วยเพิ่มประสิทธิภาพได้อย่างสม่ำเสมอโดยไม่มีความเสี่ยงด้านความเสถียร

  • การวิเคราะห์โปรไฟล์และไบนารี: เราเปรียบเทียบเนื้อหาของโปรไฟล์ใหม่อย่างเคร่งครัด (รวมถึงฟังก์ชันยอดนิยม จำนวนตัวอย่าง และขนาดโปรไฟล์) กับเวอร์ชันก่อนหน้า นอกจากนี้ เรายังใช้โปรไฟล์เพื่อสร้างอิมเมจเคอร์เนลใหม่ โดยวิเคราะห์ไบนารีเพื่อให้แน่ใจว่าการเปลี่ยนแปลงในส่วนข้อความสอดคล้องกับความคาดหวัง
  • การยืนยันประสิทธิภาพ: เราทำการเปรียบเทียบที่กำหนดเป้าหมายในอิมเมจเคอร์เนลใหม่ ซึ่งเป็นการยืนยันว่าโมเดลยังคงรักษาการปรับปรุงประสิทธิภาพที่กำหนดไว้โดยเกณฑ์พื้นฐานก่อนหน้า

การอัปเดตอย่างต่อเนื่อง

โค้ดจะ "เปลี่ยนแปลง" ไปตามเวลาโดยธรรมชาติ ดังนั้นโปรไฟล์แบบคงที่จะสูญเสียประสิทธิภาพไปในที่สุด เราเรียกใช้ไปป์ไลน์อย่างต่อเนื่องเพื่อขับเคลื่อนการอัปเดตเป็นประจำเพื่อรักษาประสิทธิภาพสูงสุดไว้ ดังนี้

  • การรีเฟรชเป็นประจำ: เราจะรีเฟรชโปรไฟล์ในสาขา LTS ของเคอร์เนล Android ก่อนการเปิดตัว GKI แต่ละครั้ง เพื่อให้มั่นใจว่าบิลด์ทุกรายการมีข้อมูลโปรไฟล์ล่าสุด
  • การขยายการให้บริการในอนาคต: ปัจจุบันเรากำลังนำการอัปเดตเหล่านี้ไปใช้กับสาขา android16-6.12 และ android15-6.6 และจะขยายการรองรับไปยัง GKI เวอร์ชันใหม่ๆ เช่น android17-6.18 ที่กำลังจะเปิดตัว

การรับประกันความเสถียร

คำถามที่พบบ่อยเกี่ยวกับการเพิ่มประสิทธิภาพที่อิงตามโปรไฟล์คือการเพิ่มประสิทธิภาพนี้ทำให้เกิดความเสี่ยงด้านความเสถียรหรือไม่ เนื่องจาก AutoFDO มีอิทธิพลต่อการวิเคราะห์พฤติกรรมของคอมไพเลอร์เป็นหลัก เช่น การแทรกฟังก์ชันในบรรทัดและเลย์เอาต์โค้ด แทนที่จะเปลี่ยนตรรกะของซอร์สโค้ด จึงช่วยรักษาความสมบูรณ์ของฟังก์ชันของเคอร์เนลไว้ได้ เทคโนโลยีนี้ได้รับการพิสูจน์แล้วว่ามีประสิทธิภาพในวงกว้าง โดยทำหน้าที่เป็นมาตรฐานการเพิ่มประสิทธิภาพสำหรับไลบรารีแพลตฟอร์ม Android, ChromeOS และโครงสร้างพื้นฐานเซิร์ฟเวอร์ของ Google เองมานานหลายปี

เราใช้กลยุทธ์ "ระมัดระวังโดยค่าเริ่มต้น" เพื่อรับประกันลักษณะการทำงานที่สอดคล้องกันมากขึ้น ฟังก์ชันที่ไม่ได้บันทึกไว้ในโปรไฟล์ที่มีความแม่นยำสูงจะได้รับการเพิ่มประสิทธิภาพโดยใช้วิธีการคอมไพเลอร์มาตรฐาน ซึ่งจะช่วยให้มั่นใจได้ว่าส่วนที่ "เย็น" หรือไม่ค่อยได้ดำเนินการของเคอร์เนลจะทำงานเหมือนกับในบิลด์มาตรฐานทุกประการ ซึ่งจะช่วยป้องกันไม่ให้ประสิทธิภาพลดลงหรือเกิดพฤติกรรมที่ไม่คาดคิดในกรณีที่เกิดขึ้นไม่บ่อยนัก

ในอนาคต

ปัจจุบันเรากำลังติดตั้งใช้งาน AutoFDO ในสาขา android16-6.12 และ android15-6.6 นอกเหนือจากการเปิดตัวครั้งแรกนี้ เราเห็นแนวทางที่น่าสนใจหลายประการในการปรับปรุงเทคโนโลยีเพิ่มเติม ดังนี้

  • การเข้าถึงที่กว้างขึ้น: เราหวังว่าจะได้ติดตั้งใช้งานโปรไฟล์ AutoFDO ในเวอร์ชันเคอร์เนล GKI ใหม่ๆ และเป้าหมายบิลด์เพิ่มเติมที่นอกเหนือจากการรองรับ aarch64 ในปัจจุบัน
  • การเพิ่มประสิทธิภาพโมดูล GKI: ปัจจุบันการเพิ่มประสิทธิภาพของเรามุ่งเน้นไปที่ไบนารีเคอร์เนลหลัก (vmlinux) การขยาย AutoFDO ไปยังโมดูล GKI อาจช่วยเพิ่มประสิทธิภาพให้กับระบบย่อยของเคอร์เนลในส่วนที่ใหญ่ขึ้นได้
  • การรองรับโมดูลของผู้ให้บริการ: เรายังสนใจที่จะรองรับ AutoFDO สำหรับโมดูลของผู้ให้บริการที่สร้างขึ้นโดยใช้ชุดพัฒนาไดรเวอร์ (DDK) ด้วย การรองรับที่มีอยู่แล้วในระบบบิลด์ (Kleaf) และเครื่องมือสร้างโปรไฟล์ (simpleperf) ช่วยให้ผู้ให้บริการใช้เทคนิคการเพิ่มประสิทธิภาพเดียวกันนี้กับไดรเวอร์ฮาร์ดแวร์ที่เฉพาะเจาะจงได้
  • ความครอบคลุมของโปรไฟล์ที่กว้างขึ้น: มีโอกาสที่จะรวบรวมโปรไฟล์จากเส้นทางของผู้ใช้ที่สำคัญ (CUJ) ที่หลากหลายมากขึ้นเพื่อเพิ่มประสิทธิภาพ

การนำ AutoFDO มาใช้กับเคอร์เนล Android ช่วยให้มั่นใจได้ว่ารากฐานของระบบปฏิบัติการได้รับการเพิ่มประสิทธิภาพให้เหมาะกับวิธีที่คุณใช้อุปกรณ์ทุกวัน

เขียนโดย
อ่านต่อ