प्रॉडक्ट से जुड़ी खबरें

Android की परफ़ॉर्मेंस को बेहतर बनाना: कर्नेल के लिए AutoFDO की सुविधा

पढ़ने में लगने वाला समय: 4 मिनट
चार्ल्स मुंगेर की प्रोफ़ाइल देखें
Yabin Cui सॉफ़्टवेयर इंजीनियर

हम Android LLVM टूलचेन टीम हैं. हमारी मुख्य प्राथमिकताओं में से एक है, एलएलवीएम नेटवर्क में ऑप्टिमाइज़ेशन की तकनीकों का इस्तेमाल करके, Android की परफ़ॉर्मेंस को बेहतर बनाना. हम लगातार ऐसे तरीके खोज रहे हैं जिनसे Android को तेज़, आसान, और ज़्यादा असरदार बनाया जा सके. ऑप्टिमाइज़ेशन का ज़्यादातर काम यूज़रस्पेस में होता है, लेकिन कर्नल अब भी सिस्टम का मुख्य हिस्सा है. आज हम यह बताने के लिए बेहद उत्साहित हैं कि हम Android कर्नेल में ऑटोमैटिक फ़ीडबैक-डायरेक्टेड ऑप्टिमाइज़ेशन (AutoFDO) को कैसे शामिल कर रहे हैं, ताकि उपयोगकर्ताओं को बेहतर परफ़ॉर्मेंस मिल सके.

AutoFDO क्या है?

स्टैंडर्ड सॉफ़्टवेयर बिल्ड के दौरान, कंपाइलर स्टैटिक कोड के हिंट के आधार पर हज़ारों छोटे-छोटे फ़ैसले लेता है. जैसे, किसी फ़ंक्शन को इनलाइन करना है या नहीं और किसी शर्त की कौनसी ब्रांच को चुना जा सकता है. हालांकि, ये अनुमान काम के होते हैं, लेकिन ये हमेशा असल दुनिया में फ़ोन के इस्तेमाल के दौरान कोड के एक्ज़ीक्यूशन का सटीक अनुमान नहीं लगाते.

AutoFDO, कंपाइलर को गाइड करने के लिए, असल दुनिया के एक्ज़ीक्यूशन पैटर्न का इस्तेमाल करके इसे बदल देता है. ये पैटर्न, कोड के असल इस्तेमाल के दौरान, निर्देश लागू करने के सबसे सामान्य पाथ दिखाते हैं. इन्हें सीपीयू के ब्रांचिंग इतिहास को रिकॉर्ड करके कैप्चर किया जाता है. हालांकि, यह डेटा फ़्लीट डिवाइसों से इकट्ठा किया जा सकता है, लेकिन कर्नेल के लिए हम इसे लैब एनवायरमेंट में सिंथेसाइज़ करते हैं. इसके लिए, हम प्रतिनिधि वर्कलोड का इस्तेमाल करते हैं. जैसे, 100 सबसे लोकप्रिय ऐप्लिकेशन चलाना. हम इस डेटा को कैप्चर करने के लिए, सैंपलिंग प्रोफ़ाइलर का इस्तेमाल करते हैं. इससे यह पता चलता है कि कोड के कौनसे हिस्से 'हॉट' (अक्सर इस्तेमाल किए जाने वाले) हैं और कौनसे 'कोल्ड' हैं. जब हम इन प्रोफ़ाइलों के साथ कर्नेल को फिर से बनाते हैं, तो कंपाइलर, Android के असल वर्कलोड के हिसाब से ऑप्टिमाइज़ेशन के बेहतर फ़ैसले ले सकता है.

इस ऑप्टिमाइज़ेशन के असर को समझने के लिए, इन मुख्य बातों पर ध्यान दें:

  • Android पर, सीपीयू समय के करीब 40% के लिए कर्नेल ज़िम्मेदार होता है.
  • हम पहले से ही AutoFDO का इस्तेमाल कर रहे हैं, ताकि यूज़रस्पेस में नेटिव एक्ज़ीक्यूटेबल और लाइब्रेरी को ऑप्टिमाइज़ किया जा सके. इससे ऐप्लिकेशन के कोल्ड लॉन्च में करीब 4% सुधार हुआ है और बूट टाइम में 1% की कमी आई है.

असल दुनिया में परफ़ॉर्मेंस के मामले में जीत

हमने लैब के कंट्रोल किए गए एनवायरमेंट से प्रोफ़ाइलें इस्तेमाल करके, Android की मुख्य मेट्रिक में शानदार सुधार देखे हैं. ये प्रोफ़ाइलें, ऐप्लिकेशन क्रॉल करने और लॉन्च करने की प्रोसेस का इस्तेमाल करके इकट्ठा की गई थीं. साथ ही, इन्हें 6.1, 6.6, और 6.12 कर्नेल वाले Pixel डिवाइसों पर मेज़र किया गया था.

सबसे अहम सुधारों की सूची यहां दी गई है. इन कर्नेल वर्शन के लिए, AutoFDO प्रोफ़ाइलों के बारे में जानकारी, android16-6.12 और android15-6.6 कर्नेल के लिए, Android कर्नेल की संबंधित रिपॉज़िटरी में मिल सकती है.

image_2.png

ये सिर्फ़ अनुमानित आंकड़े नहीं हैं. इससे असली उपयोगकर्ता को ज़्यादा तेज़ इंटरफ़ेस, ऐप्लिकेशन के बीच तेज़ी से स्विच करने की सुविधा, और बैटरी लाइफ़ बढ़ाने की सुविधा मिलती है. साथ ही, डिवाइस ज़्यादा तेज़ी से काम करता है.

यह कैसे काम करता है: पाइपलाइन

डिप्लॉयमेंट की हमारी रणनीति में एक बेहतर पाइपलाइन शामिल है. इससे यह पक्का किया जाता है कि प्रोफ़ाइलें काम की बनी रहें और परफ़ॉर्मेंस बेहतर रहे.

boosting_3.png

पहला चरण: प्रोफ़ाइल कलेक्शन

हम यूज़रस्पेस बाइनरी की प्रोफ़ाइल बनाने के लिए, अपने इंटरनल टेस्ट फ़्लीट पर भरोसा करते हैं. हालांकि, सामान्य कर्नेल इमेज (जीकेआई) के लिए, हमने लैब एनवायरमेंट का इस्तेमाल करना शुरू कर दिया है. प्रोफ़ाइलिंग को डिवाइस के रिलीज़ साइकल से अलग करने पर, डिप्लॉय किए गए कर्नेल वर्शन पर निर्भर हुए बिना, तुरंत और ज़रूरत के हिसाब से अपडेट किए जा सकते हैं. अहम बात यह है कि टेस्ट से यह पुष्टि होती है कि लैब से मिले इस डेटा से, असल दुनिया में मौजूद फ़्लीट की परफ़ॉर्मेंस के बराबर परफ़ॉर्मेंस मिलती है.

  • टूल और एनवायरमेंट: हम टेस्ट डिवाइसों को नए कर्नेल इमेज के साथ फ़्लैश करते हैं. साथ ही, निर्देश लागू करने वाली स्ट्रीम को कैप्चर करने के लिए, simpleperf का इस्तेमाल करते हैं. यह प्रोसेस, हार्डवेयर की क्षमताओं पर निर्भर करती है. इससे ब्रांचिंग हिस्ट्री को रिकॉर्ड किया जाता है. इसके लिए, Pixel डिवाइसों पर  ARM एंबेडेड ट्रेस एक्सटेंशन (ईटीई) और ARM ट्रेस बफ़र एक्सटेंशन (टीआरबीई) का इस्तेमाल किया जाता है.
  • वर्कलोड: हम Android ऐप्लिकेशन के Compatibility Test Suite (C-Suite) के 100 सबसे लोकप्रिय ऐप्लिकेशन का इस्तेमाल करके, एक वर्कलोड बनाते हैं. सबसे सटीक डेटा कैप्चर करने के लिए, हम इन बातों पर ध्यान देते हैं:
    • ऐप्लिकेशन लॉन्च करना: उपयोगकर्ता को सबसे ज़्यादा दिखने वाली देरी के लिए ऑप्टिमाइज़ करना
    • एआई की मदद से ऐप्लिकेशन क्रॉल करना: लगातार और बेहतर होते उपयोगकर्ता इंटरैक्शन को सिम्युलेट करना
    • पूरे सिस्टम की मॉनिटरिंग: फ़ोरग्राउंड ऐप्लिकेशन की गतिविधियों के साथ-साथ, बैकग्राउंड में चल रहे ज़रूरी वर्कलोड और इंटर-प्रोसेस कम्यूनिकेशन को कैप्चर करना
  • पुष्टि: यह सिंथेटिक वर्कलोड, हमारे इंटरनल फ़्लीट से इकट्ठा किए गए एक्ज़ीक्यूशन पैटर्न से 85% मिलता-जुलता है.
  • टारगेट किया गया डेटा: इन टेस्ट को बार-बार दोहराकर, हम हाई-फ़िडेलिटी वाले एक्ज़ीक्यूशन पैटर्न कैप्चर करते हैं. इनसे, सबसे लोकप्रिय ऐप्लिकेशन के साथ असल दुनिया में उपयोगकर्ता के इंटरैक्शन का सटीक पता चलता है. इसके अलावा, इस एक्सटेंसिबल फ़्रेमवर्क की मदद से, हम ज़्यादा वर्कलोड और मानदंड को आसानी से इंटिग्रेट कर सकते हैं, ताकि हम ज़्यादा से ज़्यादा चीज़ों को कवर कर सकें.

दूसरा चरण: प्रोफ़ाइल प्रोसेस करना

हम रॉ ट्रेस डेटा को पोस्ट-प्रोसेस करते हैं, ताकि यह पक्का किया जा सके कि वह साफ़, असरदार, और कंपाइलर के लिए तैयार हो.

  • एग्रीगेशन: हम कई टेस्ट रन और डिवाइसों से मिले डेटा को एक ही सिस्टम व्यू में इकट्ठा करते हैं.
  • कन्वर्ज़न: हम रॉ ट्रेस को AutoFDO प्रोफ़ाइल फ़ॉर्मैट में बदलते हैं. साथ ही, ज़रूरत के हिसाब से अनचाहे सिंबल को फ़िल्टर करते हैं.
  • प्रोफ़ाइल ट्रिम करना: हम प्रोफ़ाइलों को ट्रिम करते हैं, ताकि "कोल्ड" फ़ंक्शन का डेटा हटाया जा सके. इससे वे स्टैंडर्ड ऑप्टिमाइज़ेशन का इस्तेमाल कर पाते हैं. इससे, कम इस्तेमाल होने वाले कोड में रिग्रेशन को रोका जा सकता है. साथ ही, बाइनरी साइज़ में बेवजह होने वाली बढ़ोतरी से बचा जा सकता है.

तीसरा चरण: प्रोफ़ाइल की जांच करना

प्रोफ़ाइलों को डिप्लॉय करने से पहले, उनकी बारीकी से पुष्टि की जाती है. इससे यह पक्का किया जाता है कि वे स्थिरता से जुड़े जोखिमों के बिना, लगातार बेहतर परफ़ॉर्मेंस दें.

  • प्रोफ़ाइल और बाइनरी का विश्लेषण: हम नई प्रोफ़ाइल के कॉन्टेंट की तुलना, पिछले वर्शन से करते हैं. इसमें हॉट फ़ंक्शन, सैंपल की संख्या, और प्रोफ़ाइल का साइज़ शामिल है. हम प्रोफ़ाइल का इस्तेमाल करके, नई कर्नेल इमेज भी बनाते हैं. साथ ही, बाइनरी का विश्लेषण करके यह पक्का करते हैं कि टेक्स्ट सेक्शन में किए गए बदलाव, उम्मीदों के मुताबिक हों.
  • परफ़ॉर्मेंस की पुष्टि करना: हम नई कर्नेल इमेज पर टारगेट किए गए मानदंड चलाते हैं. इससे यह पुष्टि होती है कि यह पिछली बेसलाइन से तय की गई परफ़ॉर्मेंस में हुए सुधारों को बनाए रखता है.

लगातार अपडेट

समय के साथ कोड में अपने-आप बदलाव होता है. इसलिए, स्टैटिक प्रोफ़ाइल का असर कम हो जाता है. बेहतरीन परफ़ॉर्मेंस बनाए रखने के लिए, हम पाइपलाइन को लगातार चलाते हैं, ताकि नियमित तौर पर अपडेट मिलते रहें:

  • नियमित तौर पर रीफ़्रेश करना: हम हर GKI रिलीज़ से पहले, Android kernel LTS ब्रांच में प्रोफ़ाइलों को रीफ़्रेश करते हैं. इससे यह पक्का होता है कि हर बिल्ड में प्रोफ़ाइल का नया डेटा शामिल हो.
  • आने वाले समय में मिलने वाली सुविधाएं: फ़िलहाल, हम ये अपडेट android16-6.12 और android15-6.6 ब्रांच के लिए उपलब्ध करा रहे हैं. आने वाले समय में, हम इन्हें GKI के नए वर्शन के लिए भी उपलब्ध कराएंगे. जैसे, आने वाला android17-6.18.

स्थिरता बनाए रखना

प्रोफ़ाइल-गाइडेड ऑप्टिमाइज़ेशन के बारे में अक्सर यह सवाल पूछा जाता है कि क्या इससे ऐप्लिकेशन के क्रैश या हैंग होने का खतरा बढ़ जाता है. AutoFDO, सोर्स कोड के लॉजिक में बदलाव करने के बजाय, मुख्य रूप से कंपाइलर के ह्यूरिस्टिक पर असर डालता है. जैसे, फ़ंक्शन इनलाइनिंग और कोड लेआउट. इसलिए, यह कर्नेल की फ़ंक्शनल इंटिग्रिटी को बनाए रखता है. यह टेक्नोलॉजी पहले से ही बड़े पैमाने पर इस्तेमाल की जा रही है. यह Android प्लैटफ़ॉर्म की लाइब्रेरी, ChromeOS, और Google के सर्वर इन्फ़्रास्ट्रक्चर के लिए, सालों से स्टैंडर्ड ऑप्टिमाइज़ेशन के तौर पर काम कर रही है.

एक जैसा व्यवहार बनाए रखने के लिए, हम "डिफ़ॉल्ट रूप से रूढ़िवादी" रणनीति लागू करते हैं. जिन फ़ंक्शन को हमारी हाई-फ़िडेलिटी प्रोफ़ाइलों में कैप्चर नहीं किया जाता है उन्हें स्टैंडर्ड कंपाइलर तरीकों का इस्तेमाल करके ऑप्टिमाइज़ किया जाता है. इससे यह पक्का होता है कि कर्नेल के "कोल्ड" या कभी-कभी इस्तेमाल होने वाले हिस्से, स्टैंडर्ड बिल्ड की तरह ही काम करें. इससे परफ़ॉर्मेंस में गिरावट या कुछ मामलों में अनचाहे व्यवहार को रोका जा सकता है.

आगे की योजना

फ़िलहाल, हम android16-6.12 और android15-6.6 ब्रांच में AutoFDO को डिप्लॉय कर रहे हैं. इस शुरुआती रोल आउट के बाद, हम इस टेक्नोलॉजी को और बेहतर बनाने के लिए कई और तरीके आज़माएंगे:

  • ज़्यादा डिवाइसों पर उपलब्ध कराना: हम AutoFDO प्रोफ़ाइलों को नए GKI कर्नेल वर्शन और मौजूदा aarch64 के अलावा, अन्य बिल्ड टारगेट पर डिप्लॉय करने के लिए तैयार हैं.
  • जीकेआई मॉड्यूल ऑप्टिमाइज़ेशन: फ़िलहाल, हमारा ऑप्टिमाइज़ेशन मुख्य कर्नेल बाइनरी (vmlinux) पर फ़ोकस करता है. AutoFDO को जीकेआई मॉड्यूल तक बढ़ाने से, कर्नेल सबसिस्टम के बड़े हिस्से की परफ़ॉर्मेंस बेहतर हो सकती है.
  • वेंडर मॉड्यूल के लिए सहायता: हम ड्राइवर डेवलपमेंट किट (डीडीके) का इस्तेमाल करके बनाए गए वेंडर मॉड्यूल के लिए, AutoFDO की सुविधा उपलब्ध कराने में भी दिलचस्पी रखते हैं. हमारे बिल्ड सिस्टम (Kleaf) और प्रोफ़ाइलिंग टूल (simpleperf) में पहले से ही सहायता उपलब्ध है. इससे वेंडर, ऑप्टिमाइज़ेशन की इन तकनीकों को अपने हार्डवेयर ड्राइवर पर लागू कर सकते हैं.
  • ज़्यादा प्रोफ़ाइल कवरेज: ऑप्टिमाइज़ करने के लिए, कई तरह की क्रिटिकल यूज़र जर्नी (सीयूजे) से प्रोफ़ाइलें इकट्ठा की जा सकती हैं.

Android kernel में AutoFDO को शामिल करके, हम यह पक्का कर रहे हैं कि ओएस का मुख्य हिस्सा, आपके डिवाइस के रोज़मर्रा के इस्तेमाल के हिसाब से ऑप्टिमाइज़ किया गया हो.

लेखक:
पढ़ना जारी रखें