Android 8.0 में थ्रूपुट और इंतज़ार का समय. हालांकि, साफ़ तौर पर दिखने वाले परफ़ॉर्मेंस का पता लगाने के कई मामले होते हैं समस्याओं को हल करने में बहुत ज़्यादा समय लग सकता है और इस तरह के नतीजे अक्सर उपलब्ध नहीं है. दी गई परफ़ॉर्मेंस का इस्तेमाल किया जा रहा है होने वाले टेस्ट से डेवलपमेंट के दौरान टेस्ट करना, गंभीर समस्याओं का पता लगाना आसान हो जाता है और उपयोगकर्ता अनुभव को बेहतर बनाने के लिए किया जा सकता है.
परफ़ॉर्मेंस की जांच में ये चार कैटगरी शामिल होती हैं:
- बाइंडर थ्रूपुट (इसमें उपलब्ध है
system/libhwbinder/vts/performance/Benchmark_binder.cpp
) - बाइंडर लेटेंसी (इसमें उपलब्ध है
frameworks/native/libs/binder/tests/schd-dbg.cpp
) - hwbinder थ्रूपुट (यहां उपलब्ध है
system/libhwbinder/vts/performance/Benchmark.cpp
) - hwbinder प्रतीक्षा अवधि (इसमें उपलब्ध है
system/libhwbinder/vts/performance/Latency.cpp
)
बाइंडर और hwbinder के बारे में
बाइंडर और hwbinder, Android इंटर-प्रोसेस कम्यूनिकेशन (IPC) हैं ऐसी संरचना जो एक ही Linux ड्राइवर शेयर करती हो, लेकिन जिसमें नीचे दी गई चीज़ें हों क्वालिटी में अंतर:
पक्ष | बाइंडर | Hwbinder |
---|---|---|
मकसद | फ़्रेमवर्क के लिए, अलग-अलग कामों के लिए इस्तेमाल की जाने वाली आईपीसी स्कीम बताना | हार्डवेयर से बातचीत करें |
प्रॉपर्टी | Android फ़्रेमवर्क के इस्तेमाल के लिए ऑप्टिमाइज़ किया गया | कम से कम ओवरहेड कम इंतज़ार का समय |
फ़ोरग्राउंड/बैकग्राउंड के लिए शेड्यूल करने की नीति बदलें | हां | नहीं |
पास होने वाले तर्क | पार्सल ऑब्जेक्ट के साथ काम करने वाले सीरियलाइज़ेशन का इस्तेमाल करता है | स्कैटर बफ़र का इस्तेमाल करता है और डेटा कॉपी करने के लिए ओवरहेड से बचाता है पार्सल को क्रम से लगाना |
प्राथमिकता इनहेरिटेंस | नहीं | हां |
बाइंडर और hwbinder प्रोसेस
सिस्टम ट्रेस विज़ुअलाइज़र, लेन-देन को इस तरह दिखाता है:
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया हैऊपर दिए गए उदाहरण में:
- चार (4) schd-dbg प्रोसेस, क्लाइंट की प्रोसेस हैं.
- चार (4) बाइंडर प्रोसेस, सर्वर प्रोसेस हैं (नाम इससे शुरू होता है) बाइंडर और क्रम संख्या पर खत्म होता है.
- क्लाइंट प्रोसेस को हमेशा एक सर्वर प्रोसेस के साथ जोड़ा जाता है, जो उसके क्लाइंट से कनेक्ट करने में मदद करता है.
- सभी क्लाइंट-सर्वर प्रोसेस पेयर को कर्नेल की मदद से, अलग से शेड्यूल किया जाता है एक साथ.
सीपीयू 1 में, ओएस कर्नेल, अनुरोध जारी करने के लिए क्लाइंट को एक्ज़ीक्यूट करता है. यह तब जब भी संभव हो, तो सर्वर प्रोसेस को सक्रिय करने के लिए समान CPU का उपयोग करता है, का विकल्प होता है और अनुरोध पूरा होने के बाद संदर्भ वापस स्विच हो जाता है.
थ्रूपुट बनाम इंतज़ार का समय
सही ट्रांज़ैक्शन में, जहां क्लाइंट और सर्वर की प्रोसेस आपस में बदल जाती है बिना किसी रुकावट के, थ्रूपुट और लेटेंसी टेस्ट से आपको ज़्यादा अलग-अलग मैसेज. हालांकि, जब ओएस कर्नेल किसी रुकावट के अनुरोध (आईआरक्यू) को हैंडल कर रहा हो हार्डवेयर से लेकर, लॉक का इंतज़ार करना या किसी मैसेज को हैंडल न करने का विकल्प चुनना तो एक इंतज़ार का समय बुलबुला बन सकता है.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया हैथ्रूपुट टेस्ट, अलग-अलग तरीकों से कई ट्रांज़ैक्शन जनरेट करता है पेलोड के साइज़, जो नियमित लेन-देन के समय का अच्छा अनुमान देते हैं ( के उदाहरण) और बाइंडर की ओर से हासिल किए जा सकने वाले ज़्यादा से ज़्यादा थ्रूपुट को हासिल किया जा सकता है.
वहीं दूसरी ओर, इंतज़ार का समय कम करने के लिए पेलोड पर कोई कार्रवाई नहीं करता सामान्य लेन-देन का समय. हम बाइंडर का अनुमान लगाने के लिए लेन-देन के समय का इस्तेमाल कर सकते हैं सबसे खराब स्थिति के आंकड़े बनाने के लिए, और वे लेन-देन जिनके इंतज़ार का समय तय समयसीमा को पूरा करता है.
प्राथमिकता में बदलाव करने की सुविधा को मैनेज करना
प्राथमिकता व्युत्क्रम तब होता है जब ज़्यादा प्राथमिकता वाला थ्रेड तार्किक रूप से होता है कम प्राथमिकता वाली थ्रेड का इंतज़ार कर रहे हैं. रीयल-टाइम (RT) ऐप्लिकेशन में एक प्राथमिकता व्युत्क्रमण समस्या:
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया हैLinux कंप्लीटली फ़ेयर शेड्यूलर (सीएफ़एस) शेड्यूलिंग का इस्तेमाल करते समय, हमेशा थ्रेड तब भी चल सकता है, जब दूसरे थ्रेड की प्राथमिकता ज़्यादा होती है. इस वजह से, सीएफ़एस शेड्यूलिंग वाले ऐप्लिकेशन, प्राथमिकता में बदलाव को उम्मीद के मुताबिक मैनेज करते हैं न कि समस्या की तरह. ऐसे मामलों में जहां Android फ़्रेमवर्क को आरटी शेड्यूलिंग की ज़रूरत होती है हालांकि, ज़्यादा प्राथमिकता वाले थ्रेड के अधिकार की गारंटी के लिए, प्राथमिकता बदलने की सुविधा को हल करना ज़रूरी है.
बाइंडर लेन-देन के दौरान प्राथमिकता बदलने का उदाहरण (आरटी थ्रेड यह है बाइंडर थ्रेड का इंतज़ार करते समय, दूसरे सीएफ़एस थ्रेड से लॉजिकल तरीके से ब्लॉक किया गया सेवा):
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया हैरुकावटों से बचने के लिए, प्रायॉरिटी इनहेरिटेंस का इस्तेमाल किया जा सकता है, ताकि जल्द ही किसी आरटी क्लाइंट से अनुरोध करने पर, बाइंडर थ्रेड को आरटी थ्रेड में जोड़ा जाता है. ध्यान रखें कि आरटी शेड्यूलिंग में सीमित संसाधन होते हैं और इसका इस्तेमाल किया जाना चाहिए करते हैं. n सीपीयू वाले सिस्टम में, मौजूदा आरटी की ज़्यादा से ज़्यादा संख्या थ्रेड n भी है; अतिरिक्त आरटी थ्रेड को इंतज़ार करना पड़ सकता है (और इसलिए समय सीमा पूरी नहीं हो पाती है) अगर सभी सीपीयू अन्य आरटी थ्रेड से लिए जाते हैं.
प्राथमिकता में बदलाव की सभी संभावित समस्याओं को हल करने के लिए, प्राथमिकता का इस्तेमाल किया जा सकता है बाइंडर और hwbinder, दोनों के लिए इनहेरिटेंस. हालांकि, बाइंडर का काफ़ी इस्तेमाल होता है बाइंडर ट्रांज़ैक्शन के लिए, प्रायॉरिटी इनहेरिटेंस चालू करने से आरटी थ्रेड से सिस्टम को स्पैम के तौर पर मार्क करना.
थ्रूपुट टेस्ट चलाना
थ्रूपुट टेस्ट, binder/hwbinder ट्रांज़ैक्शन थ्रूपुट के हिसाब से किया जाता है. तय सीमा में यह एक ऐसे सिस्टम पर काम करता है जो ओवरलोड नहीं होता, लेकिन लेटेंसी बबल काफ़ी कम बार दिखते हैं और उनका असर को खत्म किया जा सकता है, बशर्ते बार-बार दोहराए जाने की संख्या काफ़ी ज़्यादा हो.
- बाइंडर थ्रूपुट टेस्ट
system/libhwbinder/vts/performance/Benchmark_binder.cpp
. - hwbinder थ्रूपुट टेस्ट इसमें है
system/libhwbinder/vts/performance/Benchmark.cpp
.
परीक्षण के नतीजे
अलग-अलग पेलोड का इस्तेमाल करके किए गए लेन-देन के लिए, थ्रूपुट टेस्ट के नतीजों का उदाहरण आकार:
Benchmark Time CPU Iterations --------------------------------------------------------------------- BM_sendVec_binderize/4 70302 ns 32820 ns 21054 BM_sendVec_binderize/8 69974 ns 32700 ns 21296 BM_sendVec_binderize/16 70079 ns 32750 ns 21365 BM_sendVec_binderize/32 69907 ns 32686 ns 21310 BM_sendVec_binderize/64 70338 ns 32810 ns 21398 BM_sendVec_binderize/128 70012 ns 32768 ns 21377 BM_sendVec_binderize/256 69836 ns 32740 ns 21329 BM_sendVec_binderize/512 69986 ns 32830 ns 21296 BM_sendVec_binderize/1024 69714 ns 32757 ns 21319 BM_sendVec_binderize/2k 75002 ns 34520 ns 20305 BM_sendVec_binderize/4k 81955 ns 39116 ns 17895 BM_sendVec_binderize/8k 95316 ns 45710 ns 15350 BM_sendVec_binderize/16k 112751 ns 54417 ns 12679 BM_sendVec_binderize/32k 146642 ns 71339 ns 9901 BM_sendVec_binderize/64k 214796 ns 104665 ns 6495
- समय, रीयल टाइम में मेज़र की गई दोतरफ़ा यात्रा में हुई देरी को दिखाता है.
- सीपीयू से, इकट्ठा किए गए उस समय की जानकारी मिलती है जो सीपीयू को शेड्यूल करने के लिए शेड्यूल किया जाता है का विकल्प चुना गया है.
- इटरेशन से पता चलता है कि टेस्ट फ़ंक्शन कितनी बार ट्रिगर हुआ लागू किया गया.
उदाहरण के लिए, 8-बाइट वाले पेलोड के लिए:
BM_sendVec_binderize/8 69974 ns 32700 ns 21296
... बाइंडर से मिलने वाली ज़्यादा से ज़्यादा थ्रूपुट वैल्यू का हिसाब इस तरह से लगाया जाता है:
8-बाइट पेलोड के साथ MAX थ्रूपुट = (8 * 21296)/69974 ~= 2.423 b/ns ~= 2.268 जीबी/सेकंड
परीक्षण के विकल्प
.json में नतीजे पाने के लिए, इसकी मदद से जांच करें
--benchmark_format=json
आर्ग्युमेंट:
libhwbinder_benchmark --benchmark_format=json
{
"context": {
"date": "2017-05-17 08:32:47",
"num_cpus": 4,
"mhz_per_cpu": 19,
"cpu_scaling_enabled": true,
"library_build_type": "release"
},
"benchmarks": [
{
"name": "BM_sendVec_binderize/4",
"iterations": 32342,
"real_time": 47809,
"cpu_time": 21906,
"time_unit": "ns"
},
….
}
इंतज़ार के समय की जांच करना
इंतज़ार के समय की जांच से यह पता चलता है कि क्लाइंट के काम शुरू करने में कितना समय लगता है ट्रांज़ैक्शन शुरू करते समय, हैंडलिंग के लिए सर्वर प्रोसेस पर जाएं और तो आपको नतीजा मिल जाएगा. यह टेस्ट ऐसे खराब शेड्यूलर व्यवहार की भी जांच करता है जो लेन-देन में लगने वाले समय पर बुरा असर डाल सकता है. जैसे, शेड्यूलर इनहेरिटेंस के लिए सहायता करता है या सिंक फ़्लैग का पालन करता है.
- बाइंडर लेटेंसी टेस्ट
frameworks/native/libs/binder/tests/schd-dbg.cpp
. - hwbinder इंतज़ार अवधि परीक्षण
system/libhwbinder/vts/performance/Latency.cpp
.
परीक्षण के नतीजे
नतीजे (.json में) औसत/सबसे अच्छे/सबसे खराब इंतज़ार के समय और तय नहीं हो पाया.
परीक्षण के विकल्प
इंतज़ार के समय की जांच में ये विकल्प इस्तेमाल किए जाते हैं:
निर्देश | ब्यौरा |
---|---|
-i value |
दोहराव की संख्या बताएं. |
-pair value |
प्रोसेस पेयर की संख्या बताएं. |
-deadline_us 2500 |
समयसीमा के बारे में हमें बताएं. |
-v |
ज़्यादा शब्दों में (डीबग करना) आउटपुट पाएं. |
-trace |
समयसीमा खत्म होने पर ट्रेस को रोकें. |
नीचे दिए गए सेक्शन में, हर विकल्प के बारे में बताया गया है. साथ ही, विकल्प और उनके इस्तेमाल के बारे में बताया गया है उदाहरण के तौर पर दिए गए नतीजे.
बार-बार इस्तेमाल करने की सुविधा चुनें
बड़ी संख्या में बार-बार दोहराने और वर्बोस आउटपुट को बंद करने का उदाहरण:
libhwbinder_latency -i 5000 -pair 3
{
"cfg":{"pair":3,"iterations":5000,"deadline_us":2500},
"P0":{"SYNC":"GOOD","S":9352,"I":10000,"R":0.9352,
"other_ms":{ "avg":0.2 , "wst":2.8 , "bst":0.053, "miss":2, "meetR":0.9996},
"fifo_ms": { "avg":0.16, "wst":1.5 , "bst":0.067, "miss":0, "meetR":1}
},
"P1":{"SYNC":"GOOD","S":9334,"I":10000,"R":0.9334,
"other_ms":{ "avg":0.19, "wst":2.9 , "bst":0.055, "miss":2, "meetR":0.9996},
"fifo_ms": { "avg":0.16, "wst":3.1 , "bst":0.066, "miss":1, "meetR":0.9998}
},
"P2":{"SYNC":"GOOD","S":9369,"I":10000,"R":0.9369,
"other_ms":{ "avg":0.19, "wst":4.8 , "bst":0.055, "miss":6, "meetR":0.9988},
"fifo_ms": { "avg":0.15, "wst":1.8 , "bst":0.067, "miss":0, "meetR":1}
},
"inheritance": "PASS"
}
जांच के इन नतीजों में यह जानकारी दिखती है:
"pair":3
- क्लाइंट और सर्वर की एक जोड़ी बनाता है.
"iterations": 5000
- इसमें 5,000 बार इस्तेमाल किए जा सकते हैं.
"deadline_us":2500
- तय समयसीमा 2,500 हमसे (2.5 मि॰से॰) है; ज़्यादातर लेन-देन इस लक्ष्य को पूरा कर सकते हैं वैल्यू.
"I": 10000
- एक टेस्ट में दो (2) लेन-देन शामिल होते हैं:
- सामान्य प्राथमिकता के हिसाब से एक लेन-देन (
CFS other
) - रीयल टाइम प्राथमिकता के हिसाब से एक लेन-देन (
RT-fifo
)
- सामान्य प्राथमिकता के हिसाब से एक लेन-देन (
"S": 9352
- 9352 लेन-देन एक ही सीपीयू में सिंक किए जाते हैं.
"R": 0.9352
- इससे पता चलता है कि क्लाइंट और सर्वर को एक साथ किस अनुपात में सिंक किया गया है एक ही सीपीयू है.
"other_ms":{ "avg":0.2 , "wst":2.8 , "bst":0.053, "miss":2, "meetR":0.9996}
- औसत (
avg
), सबसे खराब (wst
), और सबसे अच्छा स्कोर (bst
) केस, सामान्य प्रायॉरिटी कॉलर की ओर से जारी किए गए सभी लेन-देन के लिए है. दो लेन-देनmiss
करने की आखिरी तारीख है, जिससे ग्राहकों को मिलने वाले रेवेन्यू का अनुपात तय होता है (meetR
) 0.9996. "fifo_ms": { "avg":0.16, "wst":1.5 , "bst":0.067, "miss":0, "meetR":1}
other_ms
के समान, लेकिन के साथ क्लाइंट के जारी किए गए लेन-देन के लिएrt_fifo
प्राथमिकता. यह संभव है (लेकिन ज़रूरी नहीं है) किfifo_ms
के लिए,other_ms
की तुलना में बेहतर नतीजा मिला है. साथ ही, यह भी कम हैavg
औरwst
की वैल्यू औरmeetR
से ज़्यादा वैल्यू (बैकग्राउंड में लोड होने की वजह से, यह अंतर और ज़्यादा हो सकता है).
ध्यान दें: बैकग्राउंड लोड होने से, ऐप्लिकेशन के रेंडर होने में लगने वाले समय पर असर पड़ सकता है
इंतज़ार का समय की जांच में other_ms
टपल का डेटा दिखता है. सिर्फ़
बैकग्राउंड लोड होने पर, fifo_ms
मिलते-जुलते नतीजे दिखा सकता है
RT-fifo
से कम प्राथमिकता.
पेयर की वैल्यू बताएं
हर क्लाइंट प्रोसेस को एक ऐसी सर्वर प्रोसेस से जोड़ा जाता है जो क्लाइंट के लिए खास तौर पर बनी होती है,
और हर जोड़ी को किसी भी सीपीयू के लिए, अलग से शेड्यूल किया जा सकता है. हालांकि, सीपीयू से
माइग्रेशन किसी लेन-देन के दौरान तब तक नहीं होना चाहिए, जब तक कि SYNC फ़्लैग
honor
.
पक्का करें कि सिस्टम ओवरलोड न हो! अगर लोड होने में ज़्यादा समय लग रहा है, तो
सिस्टम में उम्मीद है, ओवरलोडेड सिस्टम के लिए जांच के नतीजे काम के नहीं हैं
जानकारी. ज़्यादा दबाव वाले सिस्टम की जांच करने के लिए, -pair
#cpu-1
या -pair #cpu
का इस्तेमाल सावधानी से करें. इसका उपयोग करके परीक्षण करना
n > #cpu
के साथ -pair n
ओवरलोड हो जाता है
जो काम की नहीं है.
आखिरी तारीख से जुड़ी वैल्यू बताना
बड़े पैमाने पर उपयोगकर्ता की स्थिति की जांच करने के बाद (इंतज़ार के समय की जांच को क्वालीफ़ाइंग प्रॉडक्ट), हमने तय किया है कि शर्तों को पूरा करने की समयसीमा 2.5 मि॰से॰ है. नए के लिए ज़्यादा ज़रूरतों वाले ऐप्लिकेशन (जैसे कि 1,000 फ़ोटो/सेकंड), यह आखिरी तारीख की वैल्यू बदल जाएगी.
वर्बोस आउटपुट की जानकारी दें
-v
विकल्प का इस्तेमाल करने पर, वर्बोस आउटपुट दिखता है. उदाहरण:
libhwbinder_latency -i 1 -v
-------------------------------------------------- service pid: 8674 tid: 8674 cpu: 1 SCHED_OTHER 0-------------------------------------------------- main pid: 8673 tid: 8673 cpu: 1 -------------------------------------------------- client pid: 8677 tid: 8677 cpu: 0 SCHED_OTHER 0-------------------------------------------------- fifo-caller pid: 8677 tid: 8678 cpu: 0 SCHED_FIFO 99 -------------------------------------------------- hwbinder pid: 8674 tid: 8676 cpu: 0 ??? 99-------------------------------------------------- other-caller pid: 8677 tid: 8677 cpu: 0 SCHED_OTHER 0 -------------------------------------------------- hwbinder pid: 8674 tid: 8676 cpu: 0 SCHED_OTHER 0
- सेवा थ्रेड को इसकी मदद से बनाया जाता है:
SCHED_OTHER
प्राथमिकता औरpid 8674
के साथCPU:1
में चलाएं. - इसके बाद, पहला ट्रांज़ैक्शन
fifo-caller
. इस लेन-देन की सेवा देने के लिए, hwbinder सर्वर (pid: 8674 tid: 8676
) की प्राथमिकता 99 है और इसे मार्क भी करता है कुछ समय के लिए शेड्यूलिंग क्लास के साथ (???
के तौर पर प्रिंट किया हुआ). शेड्यूलर इसके बाद सर्वर प्रोसेस कोCPU:0
में डालता है और उसे वाला सीपीयू होना चाहिए. - दूसरा लेन-देन करने वाले (कॉलर) ने
SCHED_OTHER
प्राथमिकता. सर्वर खुद को डाउनग्रेड करता है औरSCHED_OTHER
प्राथमिकता वाला कॉलर.
डीबग करने के लिए ट्रेस का इस्तेमाल करें
इंतज़ार के समय से जुड़ी समस्याओं को डीबग करने के लिए, -trace
विकल्प तय किया जा सकता है. टास्क कब शुरू होगा
इसका इस्तेमाल किया जाता है, तो इंतज़ार का समय खराब होने पर ट्रेसलॉग रिकॉर्डिंग को रोक देता है
इंतज़ार के समय का पता चलता है. उदाहरण:
atrace --async_start -b 8000 -c sched idle workq binder_driver sync freq
libhwbinder_latency -deadline_us 50000 -trace -i 50000 -pair 3
deadline triggered: halt ∓ stop trace log:/sys/kernel/debug/tracing/trace
नीचे दिए गए कॉम्पोनेंट, इंतज़ार के समय पर असर डाल सकते हैं:
- Android बिल्ड मोड. आम तौर पर, Eng मोड इससे धीमा होता है उपयोगकर्ता डीबग मोड.
- फ़्रेमवर्क. फ़्रेमवर्क सेवा का इस्तेमाल कैसे किया जाता है
बाइंडर को कॉन्फ़िगर करने के लिए
ioctl
? - बाइंडर ड्राइवर. क्या ड्राइवर, गड़बड़ी की पूरी जानकारी देता है लॉक कर रहे हैं? क्या इसमें परफ़ॉर्मेंस को बदलने वाले सभी पैच शामिल हैं?
- Kernel वर्शन. कर्नेल की रीयल-टाइम क्षमता जितनी बेहतर होगी बेहतर नतीजे मिलते हैं.
- Kernel कॉन्फ़िगरेशन. क्या कर्नेल कॉन्फ़िगरेशन में यह शामिल है
DEBUG
कॉन्फ़िगरेशन, जैसे किDEBUG_PREEMPT
औरDEBUG_SPIN_LOCK
? - केरल शेड्यूलर. क्या कर्नेल में एनर्जी-अवेयर है
शेड्यूलर (ईएएस) या हेट्रोजेनस मल्टी-प्रोसेसिंग (एचएमपी) शेड्यूलर? कोई भी कर्नेल करें
ड्राइवर (
cpu-freq
ड्राइवर,cpu-idle
ड्राइवर,cpu-hotplug
वगैरह) से शेड्यूलर पर असर पड़ता है?