การเพิ่มประสิทธิภาพ Android: ขอแนะนำ AutoFDO สำหรับเคอร์เนล
ใช้เวลาอ่าน 4 นาที
เราคือทีมเครื่องมือ LLVM ของ Android สิ่งสำคัญอันดับต้นๆ ประการหนึ่งของเราคือการปรับปรุงประสิทธิภาพของ Android ผ่านเทคนิคการเพิ่มประสิทธิภาพในระบบนิเวศ LLVM เราค้นหาวิธีการต่างๆ อย่างต่อเนื่องเพื่อทำให้อุปกรณ์ Android ทำงานได้เร็วขึ้น ราบรื่นขึ้น และมีประสิทธิภาพมากขึ้น แม้ว่างานเพิ่มประสิทธิภาพส่วนใหญ่ของเราจะเกิดขึ้นใน Userspace แต่เคอร์เนลยังคงเป็นหัวใจสำคัญของระบบ วันนี้ เรายินดีที่จะแชร์วิธีที่เรานำ การเพิ่มประสิทธิภาพแบบอัตโนมัติที่กำหนดโดยความคิดเห็น (AutoFDO) มาใช้กับเคอร์เนลของ Android เพื่อมอบประสิทธิภาพที่ดียิ่งขึ้นอย่างเห็นได้ชัดแก่ผู้ใช้
AutoFDO คืออะไร
ระหว่างการสร้างซอฟต์แวร์มาตรฐาน คอมไพเลอร์จะทำการตัดสินใจเล็กๆ น้อยๆ หลายพันครั้ง เช่น จะอินไลน์ฟังก์ชันหรือไม่ และมีแนวโน้มที่จะใช้สาขาใดของเงื่อนไข โดยอิงตามคำแนะนำโค้ดแบบคงที่ แม้ว่าฮิวริสติกเหล่านี้จะมีประโยชน์ แต่ก็ไม่ได้คาดการณ์การดำเนินการโค้ดได้อย่างแม่นยำเสมอไประหว่างการใช้งานโทรศัพท์จริง
AutoFDO เปลี่ยนสิ่งนี้โดยใช้รูปแบบการดำเนินการจริงเพื่อแนะนำคอมไพเลอร์ รูปแบบเหล่านี้แสดงถึงเส้นทางการดำเนินการคำสั่งที่พบบ่อยที่สุดที่โค้ดใช้ระหว่างการใช้งานจริง ซึ่งบันทึกโดยการบันทึกประวัติการแยกสาขาของ CPU แม้ว่าเราจะรวบรวมข้อมูลนี้จากอุปกรณ์ในกลุ่มได้ แต่สำหรับเคอร์เนล เราจะสังเคราะห์ข้อมูลในสภาพแวดล้อมของห้องทดลองโดยใช้เวิร์กโหลดที่เป็นตัวแทน เช่น การเรียกใช้แอปยอดนิยม 100 อันดับแรก เราใช้โปรไฟล์เลอร์แบบสุ่มตัวอย่างเพื่อรวบรวมข้อมูลนี้ โดยระบุส่วนของโค้ดที่ "ร้อน" (ใช้บ่อย) และส่วนที่ "เย็น" เมื่อเราสร้างเคอร์เนลใหม่ด้วยโปรไฟล์เหล่านี้ คอมไพเลอร์จะทำการตัดสินใจเพิ่มประสิทธิภาพที่ชาญฉลาดมากขึ้นซึ่งปรับให้เหมาะกับเวิร์กโหลด Android จริง
โปรดพิจารณาข้อเท็จจริงที่สำคัญต่อไปนี้เพื่อทำความเข้าใจผลกระทบของการเพิ่มประสิทธิภาพนี้
- ใน Android เคอร์เนลใช้เวลา CPU ประมาณ 40%
- เราใช้ AutoFDO เพื่อเพิ่มประสิทธิภาพไฟล์ปฏิบัติการและไลบรารีเนทีฟใน Userspace อยู่แล้ว ซึ่งช่วยให้การเปิดแอปแบบเย็นเร็วขึ้นประมาณ 4% และลดเวลาในการบูต 1%
ประสิทธิภาพที่ดียิ่งขึ้นในโลกแห่งความเป็นจริง
เราเห็นการปรับปรุงที่น่าประทับใจในเมตริกหลักของ Android โดยใช้ประโยชน์จากโปรไฟล์จากสภาพแวดล้อมของห้องทดลองที่มีการควบคุม เราได้รวบรวมโปรไฟล์เหล่านี้โดยใช้การ Crawl และการเปิดแอป รวมถึงวัดผลในอุปกรณ์ Pixel ที่ใช้เคอร์เนลเวอร์ชัน 6.1, 6.6 และ 6.12
การปรับปรุงที่เห็นได้ชัดที่สุดมีดังนี้ ดูรายละเอียดเกี่ยวกับโปรไฟล์ AutoFDO สำหรับเคอร์เนลเวอร์ชันเหล่านี้ได้ในที่เก็บเคอร์เนลของ Android ที่เกี่ยวข้องสำหรับเคอร์เนล android16-6.12 และ android15-6.6
ตัวเลขเหล่านี้ไม่ใช่แค่ตัวเลขทางทฤษฎี แต่ยังหมายถึงอินเทอร์เฟซที่ตอบสนองได้ดีขึ้น การสลับแอปที่เร็วขึ้น แบตเตอรี่ใช้งานได้นานขึ้น และอุปกรณ์โดยรวมที่ตอบสนองได้ดีขึ้นสำหรับผู้ใช้ปลายทาง
วิธีการทำงาน: ไปป์ไลน์
กลยุทธ์การติดตั้งใช้งานของเราเกี่ยวข้องกับไปป์ไลน์ที่ซับซ้อนเพื่อให้โปรไฟล์มีความเกี่ยวข้องและประสิทธิภาพยังคงมีเสถียรภาพ
ขั้นตอนที่ 1: การรวบรวมโปรไฟล์
แม้ว่าเราจะใช้กลุ่มอุปกรณ์ทดสอบภายในเพื่อสร้างโปรไฟล์ไบนารี Userspace แต่เราได้เปลี่ยนไปใช้สภาพแวดล้อมของห้องทดลองที่มีการควบคุมสำหรับรูปภาพเคอร์เนลทั่วไป (GKI) การแยกการสร้างโปรไฟล์ออกจากวงจรการเปิดตัวอุปกรณ์ช่วยให้สามารถอัปเดตได้ทันทีอย่างยืดหยุ่นโดยไม่ขึ้นอยู่กับเคอร์เนลเวอร์ชันที่ติดตั้งใช้งาน ที่สำคัญคือ การทดสอบยืนยันว่าข้อมูลที่ได้จากห้องทดลองนี้ให้ประสิทธิภาพที่เทียบได้กับข้อมูลจากกลุ่มอุปกรณ์จริง
- เครื่องมือและสภาพแวดล้อม: เราแฟลชอุปกรณ์ทดสอบด้วยรูปภาพเคอร์เนลล่าสุดและใช้ simpleperf เพื่อบันทึกสตรีมการดำเนินการคำสั่ง กระบวนการนี้อาศัยความสามารถของฮาร์ดแวร์ในการบันทึกประวัติการแยกสาขา โดยเฉพาะอย่างยิ่งการใช้ ARM Embedded Trace Extension (ETE) และARM Trace Buffer Extension (TRBE) ในอุปกรณ์ Pixel
- เวิร์กโหลด: เราสร้างเวิร์กโหลดที่เป็นตัวแทนโดยใช้แอปยอดนิยม 100 อันดับแรกจากAndroid App Compatibility Test Suite (C-Suite) เรามุ่งเน้นที่สิ่งต่อไปนี้เพื่อรวบรวมข้อมูลที่แม่นยำที่สุด
- การเปิดแอป: การเพิ่มประสิทธิภาพเพื่อลดความล่าช้าที่ผู้ใช้เห็นได้ชัดที่สุด
- การ Crawl แอปที่ขับเคลื่อนด้วย AI: การจำลองการโต้ตอบของผู้ใช้ที่ต่อเนื่องและมีการพัฒนา
- การตรวจสอบทั้งระบบ: การบันทึกไม่เพียงแต่กิจกรรมของแอปที่ทำงานอยู่เบื้องหน้า แต่ยังรวมถึงภาระงานเบื้องหลังที่สำคัญและการสื่อสารระหว่างกระบวนการ
- การตรวจสอบ: เวิร์กโหลดที่สังเคราะห์นี้แสดงความคล้ายคลึง 85% กับรูปแบบการดำเนินการที่รวบรวมจากกลุ่มอุปกรณ์ภายในของเรา
- ข้อมูลที่กำหนดเป้าหมาย: การทำซ้ำการทดสอบเหล่านี้อย่างเพียงพอจะช่วยให้เราบันทึกรูปแบบการดำเนินการที่มีความเที่ยงตรงสูงซึ่งแสดงถึงการโต้ตอบของผู้ใช้จริงกับแอปพลิเคชันยอดนิยมได้อย่างแม่นยำ นอกจากนี้ เฟรมเวิร์กที่ขยายได้นี้ยังช่วยให้เรารวมเวิร์กโหลดและเกณฑ์มาตรฐานเพิ่มเติมได้อย่างราบรื่นเพื่อขยายขอบเขตการครอบคลุม
ขั้นตอนที่ 2: การประมวลผลโปรไฟล์
เราประมวลผลข้อมูลการติดตามดิบหลังการประมวลผลเพื่อให้แน่ใจว่าข้อมูลสะอาด มีประสิทธิภาพ และพร้อมสำหรับคอมไพเลอร์
- การรวบรวม: เรารวมข้อมูลจากการทดสอบหลายครั้งและอุปกรณ์ต่างๆ ไว้ในมุมมองระบบเดียว
- การแปลง: เรา แปลงการติดตามดิบเป็นรูปแบบโปรไฟล์ AutoFDO โดยกรองสัญลักษณ์ที่ไม่ต้องการออกตามความจำเป็น
- การตัดโปรไฟล์: เราตัดโปรไฟล์เพื่อนำข้อมูลสำหรับฟังก์ชัน "เย็น" ออก เพื่อให้ฟังก์ชันเหล่านั้นใช้การเพิ่มประสิทธิภาพมาตรฐานได้ ซึ่งจะป้องกันการถดถอยของโค้ดที่ใช้ไม่บ่อยและหลีกเลี่ยงการเพิ่มขนาดไบนารีโดยไม่จำเป็น
ขั้นตอนที่ 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 สำหรับโมดูลของผู้ให้บริการที่สร้างขึ้นโดยใช้ Driver Development Kit (DDK) เนื่องจากระบบบิลด์ (Kleaf) และเครื่องมือสร้างโปรไฟล์ (simpleperf) ของเรามีการสนับสนุนอยู่แล้ว ผู้ให้บริการจึงสามารถใช้เทคนิคการเพิ่มประสิทธิภาพเดียวกันนี้กับไดรเวอร์ฮาร์ดแวร์เฉพาะของตนได้
- การครอบคลุมโปรไฟล์ที่กว้างขึ้น: มีศักยภาพในการรวบรวมโปรไฟล์จากเส้นทางของผู้ใช้ที่สำคัญ (CUJ) ที่หลากหลายมากขึ้นเพื่อเพิ่มประสิทธิภาพ
การนำ AutoFDO มาใช้กับเคอร์เนลของ Android จะช่วยให้มั่นใจได้ว่าพื้นฐานของระบบปฏิบัติการได้รับการเพิ่มประสิทธิภาพให้เหมาะกับวิธีที่คุณใช้อุปกรณ์ทุกวัน
-
ข่าวสารเกี่ยวกับผลิตภัณฑ์วันนี้เราฉลองครบรอบ 5 ปีอย่างเป็นทางการนับตั้งแต่เปิดตัว Jetpack Compose 1.0 ตั้งแต่เวอร์ชัน 1.0 ที่ประกาศเมื่อวันที่ 28 กรกฎาคม 2021 ไปจนถึงเวอร์ชัน 1.11 ล่าสุด เราเห็นว่า API มีการพัฒนาอย่างมากในช่วงหลายปีที่ผ่านมา และเราขอใช้โอกาสนี้ในการเฉลิมฉลอง
Rebecca Franks, Nick Butcher, Loryn Hairston • ใช้เวลาอ่าน 5 นาที -
ข่าวสารเกี่ยวกับผลิตภัณฑ์Android Studio Quail 2 เสถียรแล้วและพร้อมให้คุณใช้ในเวอร์ชันที่ใช้งานจริง ซึ่งจะเปลี่ยน IDE ของคุณด้วยเวิร์กโฟลว์แบบ Agent ที่ทำงานพร้อมกัน การสร้างโปรไฟล์หน่วยความจำรั่วไหลที่ผสานรวมแบบเนทีฟ และการแก้ไขข้อขัดข้องที่คำนึงถึงบริบท
Amman Asfaw • ใช้เวลาอ่าน 3 นาที -
ข่าวสารเกี่ยวกับผลิตภัณฑ์เมื่อเดือนมีนาคมที่ผ่านมา เราได้เปิดตัว Android Bench ซึ่งเป็นลีดเดอร์บอร์ด LLM สำหรับงานพัฒนา Android จริง ตั้งแต่นั้นมา เราได้ปรับปรุงเกณฑ์มาตรฐานตามความคิดเห็นของคุณ ซึ่งรวมถึงการประเมินโมเดลแบบเปิดและเพิ่มมิติข้อมูลด้านต้นทุนและประสิทธิภาพลงในลีดเดอร์บอร์ด
Zoe Lopez-Latorre • ใช้เวลาอ่าน 3 นาที
รับข้อมูลเชิงลึกล่าสุดเกี่ยวกับการพัฒนา Android ส่งตรงถึงกล่องจดหมายของคุณ ทุกสัปดาห์