कैपेसिटी, किसी डिवाइस के पास किसी तय समय के दौरान मौजूद किसी रिसॉर्स (सीपीयू, जीपीयू वगैरह) की कुल संख्या होती है. इस पेज पर, कैपेसिटी से जुड़ी समस्याओं की पहचान करने और उनका हल करने का तरीका बताया गया है.
गवर्नर की प्रतिक्रिया देर से मिलना
रुकावट से बचने के लिए, सीपीयू फ़्रीक्वेंसी गवर्नर को अचानक बढ़ने वाले वर्कलोड पर तुरंत जवाब देना होगा. ज़्यादातर यूज़र इंटरफ़ेस (यूआई) ऐप्लिकेशन एक ही बुनियादी पैटर्न का पालन करते हैं:
- उपयोगकर्ता स्क्रीन पढ़ रहा है.
- उपयोगकर्ता स्क्रीन को छूता है: किसी बटन पर टैप करता है, स्क्रोल करता है वगैरह.
- इनपुट के जवाब में, स्क्रीन स्क्रोल हो, गतिविधि में बदलाव हो या किसी तरह से ऐनिमेशन हो.
- नया कॉन्टेंट दिखने पर, सिस्टम शांत हो जाता है.
- उपयोगकर्ता, स्क्रीन को फिर से पढ़ने लगता है.
Pixel और Nexus डिवाइसों पर टच बूस्ट की सुविधा लागू होती है. इससे टच पर सीपीयू फ़्रीक्वेंसी के गवर्नर (और शेड्यूलर) के व्यवहार में बदलाव होता है. टच बूस्टर की मदद से, सीपीयू की फ़्रीक्वेंसी को धीरे-धीरे बढ़ाने से रोका जा सकता है. ऐसा करने से, डिवाइस पर टच करने पर फ़्रेम ड्रॉप होने की समस्या नहीं होती. आम तौर पर, टच बूस्टर की मदद से सीपीयू की फ़्रीक्वेंसी को तय सीमा तक सेट किया जाता है, ताकि टच करने पर सीपीयू की ज़रूरत के हिसाब से फ़्रीक्वेंसी उपलब्ध हो. फ़्लोर को छूने के बाद, वह कुछ समय तक दिखता रहता है. आम तौर पर, यह समय करीब दो सेकंड का होता है.
Pixel, ऊर्जा की जानकारी देने वाली शेड्यूलिंग (ईएएस) की मदद से, schedtune cgroup का इस्तेमाल भी करता है. यह एक अतिरिक्त टच बूस्टर सिग्नल है: schedtune की मदद से, टॉप ऐप्लिकेशन को ज़्यादा प्राथमिकता दी जाती है, ताकि उन्हें तेज़ी से चलने के लिए ज़रूरत के मुताबिक सीपीयू मिल सके. Kryo सीपीयू वाले Pixel की तुलना में, Nexus 5X और 6P के छोटे और बड़े सीपीयू क्लस्टर (क्रमशः A53 और A57) के बीच परफ़ॉर्मेंस में काफ़ी ज़्यादा अंतर है. हमें पता चला है कि यूज़र इंटरफ़ेस को आसानी से रेंडर करने के लिए, छोटा सीपीयू क्लस्टर हमेशा काफ़ी नहीं होता. खास तौर पर, डिवाइस पर होने वाली रुकावटों की वजह से.
इसलिए, Nexus 5X और 6P पर टच बूस्टर, शेड्यूलर के व्यवहार में बदलाव करता है, ताकि फ़ोरग्राउंड ऐप्लिकेशन को बड़ी कोर पर ले जाने की संभावना बढ़ सके. यह सीपीयू फ़्रीक्वेंसी के फ़्लोर की तरह ही है. अगर स्चेड्यूलर में बदलाव नहीं किया जाता, ताकि फ़ोरग्राउंड ऐप्लिकेशन को बड़े सीपीयू क्लस्टर पर ले जाया जा सके, तो हो सकता है कि फ़ोरग्राउंड ऐप्लिकेशन को रेंडर करने के लिए सीपीयू की क्षमता कम पड़ जाए. ऐसा तब तक होगा, जब तक स्चेड्यूलर, थ्रेड को बड़े सीपीयू कोर पर लोड बैलेंस करने का फ़ैसला नहीं ले लेता. टच बूस्टर के दौरान शेड्यूलर के व्यवहार को बदलने से, यूज़र इंटरफ़ेस (यूआई) थ्रेड को तुरंत बड़े कोर पर चलाने और रुकावट से बचने की संभावना बढ़ जाती है. हालांकि, इसे हमेशा बड़े कोर पर चलाने के लिए मजबूर नहीं किया जाता, क्योंकि इससे बिजली की खपत पर काफ़ी असर पड़ सकता है.
थर्मल थ्रॉटलिंग
थर्मल थ्रॉटलिंग तब होती है, जब डिवाइस को अपने कुल थर्मल आउटपुट को कम करना पड़ता है. आम तौर पर, सीपीयू, जीपीयू, और डीआरएएम क्लॉक को कम करके ऐसा किया जाता है. इसमें कोई आश्चर्य नहीं है कि अक्सर इस वजह से, पेज पर रुकावट आती है. ऐसा इसलिए होता है, क्योंकि हो सकता है कि सिस्टम तय समयसीमा में पेज को रेंडर करने के लिए ज़रूरी क्षमता न दे पाए. थर्मल ट्रिलिंग से बचने का सिर्फ़ एक ही तरीका है, कम पावर का इस्तेमाल करना. ऐसा करने के कई तरीके नहीं हैं. हालांकि, पहले के एसओसी के साथ अपने अनुभवों के आधार पर, हमारे पास सिस्टम वेंडर के लिए कुछ सुझाव हैं.
सबसे पहले, अलग-अलग सीपीयू आर्किटेक्चर वाले नए एसओसी को बनाते समय, पक्का करें कि सीपीयू क्लस्टर की परफ़ॉर्मेंस/W कर्व ओवरलैप हों. प्रोसेसर की कुल परफ़ॉर्मेंस/W कर्व एक सीधी लाइन होनी चाहिए. परफ़ॉर्मेंस/वॉटर कूलर के कर्व में रुकावटें होने पर, शेड्यूलर और फ़्रीक्वेंसी गवर्नर को यह अनुमान लगाना पड़ता है कि वर्कलोड के लिए क्या ज़रूरी है. रुकावटों से बचने के लिए, शेड्यूलर और फ़्रीक्वेंसी गवर्नर, वर्कलोड को ज़रूरत से ज़्यादा कैपेसिटी देते हैं. इससे डिवाइस पर बहुत ज़्यादा पावर खर्च होती है, जिसकी वजह से थर्मल थ्रॉटलिंग होती है.
दो सीपीयू क्लस्टर वाले काल्पनिक एसओसी की कल्पना करें:
- क्लस्टर 1, जो कि छोटा क्लस्टर है, 100 से 300 एमडब्ल्यू तक खर्च कर सकता है. साथ ही, क्लॉक के हिसाब से, थ्रुपुट बेंचमार्क में 100 से 300 तक स्कोर कर सकता है.
- क्लस्टर 2, जो कि बड़ा क्लस्टर है, 1,000 से 1,600 एमडब्ल्यू तक खर्च कर सकता है. साथ ही, क्लॉक के हिसाब से एक ही थ्रुपुट बेंचमार्क में 800 से 1,200 के बीच स्कोर कर सकता है.
इस बेंचमार्क में, ज़्यादा स्कोर का मतलब है कि प्रोसेस तेज़ी से हुई. हालांकि, तेज़ी से काम करने के लिए ज़्यादा बिजली की ज़रूरत होती है, लेकिन यह धीमे काम करने के मुकाबले ज़्यादा बेहतर नहीं है.
अगर शेड्यूलर को लगता है कि किसी यूज़र इंटरफ़ेस (यूआई) के वर्कलोड के लिए, थ्रुपुट के उस मानदंड पर 310 के बराबर स्कोर की ज़रूरत होगी, तो झटके से बचने के लिए सबसे अच्छा विकल्प यह है कि बड़े क्लस्टर को सबसे कम फ़्रीक्वेंसी पर चलाया जाए. इससे ज़्यादा बिजली खर्च होती है. (यह, cpuidle के व्यवहार और रेस टू आइडल पर निर्भर करता है; लगातार परफ़ॉर्मेंस/वॉट कर्व वाले एसओसी को ऑप्टिमाइज़ करना आसान होता है.)
दूसरा, cpuset का इस्तेमाल करें. पक्का करें कि आपने अपने कर्नेल और BoardConfig.mk
में, सीपीयू सेट चालू किए हों. आपको अपने डिवाइस के हिसाब से init.rc
में, असल cpuset असाइनमेंट भी सेट अप करने होंगे. कुछ वेंडर अपने बीएसपी में इसे बंद रखते हैं, ताकि वे शेड्यूलर के व्यवहार पर असर डालने के लिए, अन्य हिंट का इस्तेमाल कर सकें. हालांकि, हमें लगता है कि ऐसा करना सही नहीं है. सीपीयू सेट, यह पक्का करने के लिए काम के होते हैं कि सीपीयू के बीच लोड बैलेंसिंग इस तरह से की जाए कि यह पता चल सके कि उपयोगकर्ता डिवाइस पर क्या कर रहा है.
ActivityManager, ऐप्लिकेशन की अहमियत (टॉप, फ़ोरग्राउंड, बैकग्राउंड) के आधार पर, उन्हें अलग-अलग सीपीयू सेट में असाइन करता है. ज़्यादा अहम ऐप्लिकेशन को सीपीयू कोर का ज़्यादा ऐक्सेस मिलता है. इससे फ़ोरग्राउंड और टॉप ऐप्लिकेशन के लिए, सेवा की क्वालिटी को पक्का करने में मदद मिलती है.
cpuset, एक जैसे सीपीयू कॉन्फ़िगरेशन के लिए काम के होते हैं. हालांकि, आपको cpuset चालू किए बिना, अलग-अलग सीपीयू कॉन्फ़िगरेशन वाले डिवाइस को शिप नहीं करना चाहिए. अलग-अलग सीपीयू कॉन्फ़िगरेशन पर cpuset का इस्तेमाल करने का तरीका जानने के लिए, Nexus 6P एक अच्छा मॉडल है. अपने डिवाइस के कॉन्फ़िगरेशन के लिए, इसका इस्तेमाल करें.
cpuset, बैकग्राउंड थ्रेड को सीपीयू के बड़े कोर पर लोड बैलेंस करने से रोकता है. ऐसा इसलिए किया जाता है, ताकि परफ़ॉर्मेंस पर असर न डालने वाली थ्रेड, बैकग्राउंड में ज़्यादा एनर्जी खर्च न करें. इससे, डिवाइस के गर्म होने की वजह से, डिवाइस की परफ़ॉर्मेंस में कमी आने से भी बचा जा सकता है. थर्मल थ्रॉटलिंग, डिवाइस की क्षमता से जुड़ी समस्या है. हालांकि, थर्मल थ्रॉटलिंग के दौरान, यूज़र इंटरफ़ेस (यूआई) की परफ़ॉर्मेंस पर, जित्टर में हुए सुधारों का काफ़ी असर पड़ता है. सिस्टम 60 FPS की दर से रेंडर करने की अपनी क्षमता के करीब चल रहा होगा. इसलिए, फ़्रेम छोड़ने के लिए कम झटका लगता है.