أرسلت بواسطة يابين كوي, مهندس البرمجيات
نحن فريق أدوات Android LLVM. إحدى أهم أولوياتنا هي تحسين أداء Android من خلال تقنيات التحسين في نظام LLVM البيئي. نحن نبحث باستمرار عن طرق لجعل Android أسرع وأكثر سلاسة وكفاءة. على الرغم من أن الكثير من أعمال التحسين لدينا تتم في مساحة المستخدمين، إلا أن النواة تظل هي قلب النظام. اليوم، يسعدنا أن نشارك كيف نجلب التحسين التلقائي الموجه للملاحظات (AutoFDO) إلى Android kernel لتحقيق مكاسب كبيرة في الأداء للمستخدمين.
أثناء بناء البرنامج القياسي، يتخذ المترجم آلاف القرارات الصغيرة، مثل ما إذا كان سيتم تضمين دالة وأي فرع من الشرط الشرطي من المحتمل أن يتم اتخاذه، بناءً على تلميحات التعليمات البرمجية الثابتة.على الرغم من أن هذه الاستدلالات مفيدة، إلا أنها لا تتنبأ دائمًا بدقة بتنفيذ التعليمات البرمجية أثناء استخدام الهاتف في العالم الحقيقي.
يغير AutoFDO هذا باستخدام أنماط التنفيذ في العالم الحقيقي لتوجيه المترجم. تمثل هذه الأنماط مسارات تنفيذ التعليمات الأكثر شيوعًا التي يتخذها الكود أثناء الاستخدام الفعلي، والتي يتم التقاطها عن طريق تسجيل سجل تفرع وحدة المعالجة المركزية. على الرغم من إمكانية جمع هذه البيانات من مجموعة الأجهزة، إلا أننا نقوم بتوليفها بالنسبة للنواة في بيئة معملية باستخدام أحمال عمل تمثيلية، مثل تشغيل أفضل 100 تطبيق الأكثر شيوعًا. نحن نستخدم ملف تعريف العينات لالتقاط هذه البيانات، وتحديد أجزاء التعليمات البرمجية “الساخنة” (المستخدمة بشكل متكرر) وأيها “باردة”.
عندما نعيد بناء النواة باستخدام هذه الملفات الشخصية، يمكن للمترجم اتخاذ قرارات تحسين أكثر ذكاءً ومصممة خصيصًا لأحمال عمل Android الفعلية.
لفهم تأثير هذا التحسين، خذ في الاعتبار هذه الحقائق الأساسية:
- على نظام Android، يمثل النواة حوالي 40% من وقت وحدة المعالجة المركزية.
- نحن نستخدم بالفعل AutoFDO لتحسين الملفات التنفيذية والمكتبات الأصلية في مساحة المستخدم، مما يحقق تحسينًا في تشغيل التطبيق البارد بنسبة 4% تقريبًا وتقليل وقت التشغيل بنسبة 1%.
الأداء في العالم الحقيقي يفوز
لقد شهدنا تحسينات مذهلة عبر مقاييس Android الرئيسية من خلال الاستفادة من الملفات الشخصية من بيئات المختبرات الخاضعة للرقابة. تم جمع ملفات التعريف هذه باستخدام الزحف إلى التطبيق وتشغيله، وتم قياسها على أجهزة Pixel عبر النواة 6.1 و6.6 و6.12.
التحسينات الأكثر وضوحا مذكورة أدناه. يمكن العثور على تفاصيل حول ملفات تعريف AutoFDO لإصدارات kernel هذه في مستودعات Android kernel الخاصة بنواة android16-6.12 وandroid15-6.6.
هذه ليست مجرد أرقام نظرية. إنها تترجم إلى واجهة أكثر سرعة، وتبديل أسرع للتطبيقات، وعمر بطارية ممتد، وجهاز أكثر استجابة بشكل عام للمستخدم النهائي.
تتضمن إستراتيجية النشر الخاصة بنا مسارًا متطورًا لضمان بقاء الملفات الشخصية ذات صلة وبقاء الأداء مستقرًا.
الخطوة 1: جمع الملفات الشخصية
بينما نعتمد على أسطول الاختبار الداخلي الخاص بنا لتعريف ثنائيات مساحة المستخدم، فقد تحولنا إلى بيئة معملية خاضعة للرقابة لـ صورة النواة العامة (GKI). يتيح فصل ملفات التعريف عن دورة إصدار الجهاز إجراء تحديثات مرنة وفورية بشكل مستقل عن إصدارات kernel المنشورة. والأهم من ذلك، أن الاختبارات تؤكد أن هذه البيانات المستندة إلى المختبر توفر مكاسب في الأداء مماثلة لتلك التي تحققها الأساطيل في العالم الحقيقي.
-
المراقبة على مستوى النظام: ليس فقط التقاط أنشطة التطبيق الأمامية، ولكن أيضًا أعباء العمل المهمة في الخلفية والاتصالات بين العمليات
-
تصديق: يظهر عبء العمل المركب هذا 85% تشابه لأنماط التنفيذ التي تم جمعها من أسطولنا الداخلي.
-
البيانات المستهدفة: ومن خلال تكرار هذه الاختبارات بشكل كافٍ، فإننا نلتقط أنماط تنفيذ عالية الدقة تمثل بدقة تفاعل المستخدم في العالم الحقيقي مع التطبيقات الأكثر شيوعًا. علاوة على ذلك، يتيح لنا إطار العمل القابل للتوسيع هذا دمج أعباء العمل والمعايير الإضافية بسلاسة لتوسيع تغطيتنا.
الخطوة 2: معالجة الملف الشخصي
نقوم بالمعالجة اللاحقة لبيانات التتبع الأولية للتأكد من أنها نظيفة وفعالة وجاهزة للمترجم.
-
تجميع: نقوم بدمج البيانات من عمليات تشغيل وأجهزة اختبارية متعددة في عرض نظام واحد.
-
تحويل: نحن يتحول آثار أولية في تنسيق ملف تعريف AutoFDO، وتصفية الرموز غير المرغوب فيها حسب الحاجة.
-
تقليم الملف الشخصي: نقوم بقص الملفات الشخصية لإزالة البيانات الخاصة بالوظائف “الباردة”، مما يسمح لها باستخدام التحسين القياسي. يؤدي ذلك إلى منع التراجعات في التعليمات البرمجية التي نادرًا ما يتم استخدامها وتجنب الزيادات غير الضرورية في الحجم الثنائي.
الخطوة 3: اختبار الملف الشخصي
قبل النشر، تخضع الملفات الشخصية للتحقق الصارم للتأكد من أنها تقدم أداءً متسقًا دون مخاطر الاستقرار.
-
الملف الشخصي والتحليل الثنائي: نحن نقارن بدقة محتوى الملف الشخصي الجديد (بما في ذلك الوظائف الساخنة وعدد العينات وحجم الملف الشخصي) مع الإصدارات السابقة. نستخدم أيضًا ملف التعريف لإنشاء صورة نواة جديدة، وتحليل الثنائيات للتأكد من أن التغييرات التي يتم إجراؤها على قسم النص تتوافق مع التوقعات.
-
التحقق من الأداء: نقوم بتشغيل معايير مستهدفة على صورة النواة الجديدة. وهذا يؤكد أنه يحافظ على تحسينات الأداء التي حددتها خطوط الأساس السابقة.
تحديثات مستمرة
“تنحرف” التعليمات البرمجية بشكل طبيعي بمرور الوقت، لذا فإن الملف الشخصي الثابت سيفقد فعاليته في النهاية. للحفاظ على أعلى مستوى من الأداء، نقوم بتشغيل المسار بشكل مستمر لدفع التحديثات المنتظمة:
-
التحديث المنتظم: نقوم بتحديث الملفات الشخصية في فروع أندرويد نواة LTS قبل كل إصدار من إصدارات GKI، مما يضمن أن كل إصدار يتضمن أحدث بيانات الملف الشخصي.
-
التوسع المستقبلي: نقوم حاليًا بتسليم هذه التحديثات إلى android16-6.12 و android15-6.6 الفروع وسيتم توسيع الدعم ليشمل إصدارات GKI الأحدث، مثل الإصدار القادم android17-6.18.
من الأسئلة الشائعة المتعلقة بالتحسين الموجه بالملف الشخصي ما إذا كان يؤدي إلى مخاطر تتعلق بالاستقرار. نظرًا لأن AutoFDO يؤثر بشكل أساسي على استدلالات المترجم، مثل تضمين الوظيفة وتخطيط التعليمات البرمجية، بدلاً من تغيير منطق التعليمات البرمجية المصدر، فإنه يحافظ على التكامل الوظيفي للنواة. لقد أثبتت هذه التقنية بالفعل فعاليتها على نطاق واسع، حيث كانت بمثابة تحسين قياسي لمكتبات نظام التشغيل Android ونظام التشغيل ChromeOS والبنية التحتية للخادم الخاص بشركة Google لسنوات.
ولضمان المزيد من السلوك المتسق، فإننا نطبق استراتيجية “محافظة افتراضيًا”. يتم تحسين الوظائف التي لم يتم التقاطها في ملفات التعريف عالية الدقة الخاصة بنا باستخدام أساليب التحويل البرمجي القياسية. وهذا يضمن أن الأجزاء “الباردة” أو التي نادرًا ما يتم تنفيذها من النواة تتصرف تمامًا كما تفعل في البنية القياسية، مما يمنع تراجعات الأداء أو السلوكيات غير المتوقعة في الحالات الزاوية.
نقوم حاليًا بنشر AutoFDO عبر android16-6.12 و android15-6.6 الفروع. وبعيدًا عن هذا الطرح الأولي، نرى عدة طرق واعدة لزيادة تعزيز التكنولوجيا:
-
الوصول الموسع: نحن نتطلع إلى نشر ملفات تعريف AutoFDO في إصدارات kernel الأحدث لـ GKI وأهداف البناء الإضافية بما يتجاوز الإصدار الحالي aarch64 يدعم.
-
تحسين وحدة GKI: حاليًا، يركز التحسين لدينا على ثنائي النواة الرئيسي (com.vmlinux). قد يؤدي توسيع AutoFDO إلى وحدات GKI إلى تحقيق فوائد الأداء لجزء أكبر من نظام kernel الفرعي.
-
دعم وحدة البائع: نحن مهتمون أيضًا بدعم AutoFDO لوحدات البائعين المبنية باستخدام مجموعة تطوير برامج التشغيل (DDK). مع الدعم المتاح بالفعل في نظام البناء لدينا (كليف) وأدوات التنميط (com.simpleperf)، وهذا يسمح للبائعين بتطبيق تقنيات التحسين نفسها على برامج تشغيل الأجهزة المحددة الخاصة بهم.
-
تغطية الملف الشخصي على نطاق أوسع: هناك إمكانية لجمع ملفات التعريف من نطاق أوسع من رحلات المستخدم المهمة (CUJs) لتحسينها.
من خلال جلب AutoFDO إلى نواة Android، فإننا نضمن أن أساس نظام التشغيل قد تم تحسينه ليتناسب مع الطريقة التي تستخدم بها جهازك كل يوم.

