การเพิ่มประสิทธิภาพ Android: ขอแนะนำ AutoFDO สำหรับเคอร์เนล
ใช้เวลาอ่าน 4 นาที
เราคือทีม Android LLVM Toolchain สิ่งสำคัญอันดับต้นๆ ของเราคือการปรับปรุงประสิทธิภาพของ Android ผ่านเทคนิคการเพิ่มประสิทธิภาพในระบบนิเวศ LLVM เราพยายามหาวิธีทำให้ Android ทำงานได้เร็วขึ้น ราบรื่นขึ้น และมีประสิทธิภาพมากขึ้นอยู่เสมอ แม้ว่างานเพิ่มประสิทธิภาพส่วนใหญ่จะเกิดขึ้นในพื้นที่ผู้ใช้ แต่เคอร์เนลยังคงเป็นหัวใจสำคัญของระบบ วันนี้เรายินดีที่จะแชร์วิธีที่เรานำ Automatic Feedback-Directed Optimization (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
ตัวเลขเหล่านี้ไม่ใช่แค่ตัวเลขทางทฤษฎี ซึ่งจะช่วยให้อินเทอร์เฟซทำงานได้เร็วขึ้น สลับแอปได้เร็วขึ้น ยืดอายุการใช้งานแบตเตอรี่ และทำให้อุปกรณ์ตอบสนองได้ดีขึ้นโดยรวมสำหรับผู้ใช้ปลายทาง
วิธีการทำงาน: ไปป์ไลน์
กลยุทธ์การติดตั้งใช้งานของเราเกี่ยวข้องกับไปป์ไลน์ที่ซับซ้อนเพื่อให้มั่นใจว่าโปรไฟล์จะยังคงมีความเกี่ยวข้องและประสิทธิภาพยังคงเสถียร
ขั้นตอนที่ 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 ช่วยให้มั่นใจได้ว่ารากฐานของระบบปฏิบัติการได้รับการเพิ่มประสิทธิภาพให้เหมาะกับวิธีที่คุณใช้อุปกรณ์ทุกวัน
-
ข่าวสารเกี่ยวกับผลิตภัณฑ์วันนี้ที่งาน Android Dev Summit เราขอประกาศความพร้อมให้บริการในวงกว้างของเครื่องมือและ API จำนวนมากที่ออกแบบมาเพื่อลดความยุ่งยากในชีวิตประจำวันและช่วยให้คุณสร้างแอป Android ที่ยอดเยี่ยมได้อย่างยืดหยุ่นมากขึ้น
Matthew McCullough • ใช้เวลาอ่าน 4 นาที -
ข่าวสารเกี่ยวกับผลิตภัณฑ์Android Studio Rabbit 2 มีความเสถียรและพร้อมให้คุณใช้งานในเวอร์ชันที่ใช้งานจริงแล้ว รุ่นนี้มีฟีเจอร์หลักๆ ที่จะช่วยปรับปรุงการพัฒนาของคุณ เช่น Bring Your Own Agent, ฟีเจอร์ใหม่ของโปรแกรมจำลอง XR, การอัปเดต LeakCanary, เครื่องมือจัดการทักษะ Agent ใหม่, รีวิวโค้ดด้วย AI และอื่นๆ
Matthew Warner • ใช้เวลาอ่าน 3 นาที -
ข่าวสารเกี่ยวกับผลิตภัณฑ์แอปที่กำหนดเป้าหมายเป็น Android รุ่นที่กำลังจะเปิดตัวจะไม่สามารถเขียนลงในรายชื่อติดต่อโดยตรงด้วยสิทธิ์ WRITE_CONTACTS ได้อีกต่อไป
Roxanna Aliabadi Walker • ใช้เวลาอ่าน 6 นาที
รับข้อมูลเชิงลึกเกี่ยวกับการพัฒนา Android ล่าสุดที่ส่งไปยังกล่องจดหมายของคุณทุกสัปดาห์