इस पेज में बताया गया है कि अपनी कैश हिट दर की जांच कैसे करें. साथ ही, यह भी बताया गया है कि रिमोट तरीके से एक्ज़ीक्यूट करने के मामले में, कैश मेमोरी में मौजूद गड़बड़ियों की जांच कैसे करें.
इस पेज पर यह माना गया है कि आपके पास ऐसा बिल्ड और/या टेस्ट है जो रिमोट एक्ज़ीक्यूशन का सही तरीके से इस्तेमाल करता है. साथ ही, आपको यह पक्का करना है कि रिमोट कैश का बेहतर तरीके से इस्तेमाल किया जा रहा हो.
कैश हिट रेट की जांच करना
Bazel रन के स्टैंडर्ड आउटपुट में, INFO
लाइन देखें. इसमें उन प्रोसेस की सूची दी गई है जो आम तौर पर Bazel ऐक्शन से जुड़ी होती हैं. उस लाइन से पता चलता है
कि कार्रवाई कहां हुई थी. remote
लेबल खोजें, जो रिमोट तरीके से की गई कार्रवाई, लोकल सैंडबॉक्स में की गई कार्रवाइयों के लिए linux-sandbox
, और एक्ज़ीक्यूशन की दूसरी रणनीतियों के लिए अन्य वैल्यू दिखाता है. रिमोट कैश से मिली कार्रवाई, remote cache hit
के तौर पर दिखती है.
उदाहरण के लिए:
INFO: 11 processes: 6 remote cache hit, 3 internal, 2 remote.
इस उदाहरण में छह रिमोट कैश हिट थे, जबकि दो कार्रवाइयों में कैश हिट नहीं थे और इन्हें रिमोट तरीके से एक्ज़ीक्यूट किया गया था. संगठन के तीन हिस्से को अनदेखा किया जा सकता है.
यह आम तौर पर बहुत छोटी अंदरूनी कार्रवाइयां होती हैं, जैसे कि सांकेतिक लिंक बनाना. इस खास जानकारी में लोकल कैश मेमोरी के हिट शामिल नहीं किए जाते. अगर आपको कोई प्रोसेस नहीं मिल रही है (या उम्मीद से कम संख्या मिल रही है), तो bazel clean
चलाएं और उसके बाद बिल्ड/टेस्ट
कमांड दें.
कैश हिट की समस्या का हल करना
अगर आपको कैश हिट दर उम्मीद के मुताबिक नहीं मिल रही है, तो ये काम करें:
पक्का करें कि एक ही बिल्ड/टेस्ट कमांड को फिर से चलाने से कैश हिट जनरेट होते हों
वे बिल्ड और/या टेस्ट चलाएं जिनसे आपको कैश मेमोरी में डेटा भरने की उम्मीद है. जब पहली बार किसी खास स्टैक पर कोई नया बिल्ड चलाया जाता है, तो आपको कोई रिमोट कैश हिट नहीं मिलेगा. रिमोट तरीके से एक्ज़ीक्यूशन की प्रक्रिया के तहत, कार्रवाई के नतीजों को कैश मेमोरी में सेव किया जाता है. इसके बाद, उन्हें बाद में चलाया जाता है.
bazel clean
चलाएं. यह निर्देश आपके लोकल कैश को मिटा देता है, जिससे आपको लोकल कैश हिट से नतीजों को मास्क किए बिना रिमोट कैश हिट की जांच करने की सुविधा मिलती है.वे बिल्ड और टेस्ट चलाएं जिनकी आपको फिर से जांच करनी है (उसी मशीन पर).
कैश हिट रेट के लिए,
INFO
लाइन देखें. अगर आपकोremote cache hit
औरinternal
के अलावा कोई प्रोसेस नहीं दिखती है, तो इसका मतलब है कि आपकी कैश मेमोरी सही तरीके से भरी जा रही है और ऐक्सेस की जा रही है. ऐसे में, अगले सेक्शन पर जाएं.बिल्ड में अंतर का एक संभावित सोर्स नॉन-हेरमेटिक होता है, जिसकी वजह से दोनों कार्रवाइयों के लिए कार्रवाइयों को अलग-अलग ऐक्शन कुंजियां मिलती हैं. ऐसी कार्रवाइयों को देखने के लिए, ये काम करें:
a. एक्ज़ीक्यूशन लॉग पाने के लिए, विचाराधीन बिल्ड या टेस्ट फिर से चलाएं:
bazel clean
bazel --optional-flags build //your:target --execution_log_binary_file=/tmp/exec1.log
b. दो रन के बीच एक्ज़ीक्यूशन लॉग की तुलना करें. पक्का करें कि ये कार्रवाइयां, दो लॉग फ़ाइलों पर एक जैसी हैं. अंतर से पता चलता है कि प्रोसेस करने के दौरान क्या बदलाव हुए. उन अंतर को खत्म करने के लिए, अपना बिल्ड अपडेट करें.
अगर कैश मेमोरी की समस्याओं को हल किया जा सकता है और अब बार-बार चलाने की वजह से सभी कैश हिट जनरेट होते हैं, तो सीधे अगले सेक्शन पर जाएं.
अगर आपके ऐक्शन आईडी एक जैसे हैं, लेकिन कोई कैश हिट नहीं है, तो इसका मतलब है कि आपके कॉन्फ़िगरेशन में मौजूद कोई चीज़, कैश मेमोरी में सेव होने से रोक रही है. सामान्य समस्याओं की जांच करने के लिए, इस सेक्शन पर जाएं.
अगर आपको एक्ज़ीक्यूशन लॉग को अलग करने की ज़रूरत नहीं है, तो इसके बजाय, इंसान के पढ़े जा सकने वाले
--execution_log_json_file
फ़्लैग का इस्तेमाल करें. इसका इस्तेमाल स्थायी डिफ़रेंस के लिए नहीं किया जा सकता. ऐसा इसलिए, क्योंकि इसमें एक्ज़ीक्यूशन का समय होता है और यह ऑर्डर करने की गारंटी नहीं देता.जांचें कि एक्ज़ीक्यूशन लॉग की सभी कार्रवाइयों के लिए
cacheable
'सही' पर सेट है या नहीं. अगर किसी देने वाली कार्रवाई के लिए, एक्ज़ीक्यूशन लॉग मेंcacheable
नहीं दिखता है, तो इसका मतलब है कि उससे जुड़े नियम कीBUILD
फ़ाइल में परिभाषा मेंno-cache
टैग हो सकता है. ऐक्शन कहां से आ रहा है, यह पता करने के लिए एक्ज़ीक्यूशन लॉग मेंprogress_message
फ़ील्ड देखें, जिसे कोई भी व्यक्ति आसानी से पढ़ सके.अगर कार्रवाइयां एक जैसी हैं और
cacheable
, लेकिन कैश हिट नहीं हैं, तो हो सकता है कि आपकी कमांड लाइन में--noremote_accept_cached
शामिल हो. इससे बिल्ड के लिए कैश लुकअप बंद हो सकते हैं.अगर असली कमांड लाइन का पता लगाना मुश्किल है, तो बिल्ड इवेंट प्रोटोकॉल से कैननिकल कमांड लाइन का इस्तेमाल इस तरह करें:
a. लॉग का टेक्स्ट वर्शन पाने के लिए, अपने Bazel कमांड में
--build_event_text_file=/tmp/bep.txt
को जोड़ें.b. लॉग का टेक्स्ट वर्शन खोलें और
command_line_label: "canonical"
वालाstructured_command_line
मैसेज खोजें. इसमें बड़ा करने के बाद के सभी विकल्पों की सूची होगी.c.
remote_accept_cached
खोजें और देखें कि यहfalse
पर सेट है या नहीं.d. अगर
remote_accept_cached
,false
है, तो यह देखें कि इसेfalse
पर कहां सेट किया जा रहा है: कमांड लाइन या किसी bazelrc फ़ाइल में.
सभी मशीनों पर कैश मेमोरी में सेव करना पक्का करें
एक ही मशीन पर उम्मीद के मुताबिक कैश हिट होने के बाद, किसी दूसरी मशीन पर वही बिल्ड/टेस्ट चलाएं. अगर आपको संदेह है कि मशीन पर कैशिंग नहीं हो रही है, तो ये करें:
मौजूदा कैश मेमोरी का इस्तेमाल करने से बचने के लिए, अपने बिल्ड में छोटा सा बदलाव करें.
पहली मशीन पर बिल्ड चलाएं:
bazel clean
bazel ... build ... --execution_log_binary_file=/tmp/exec1.log
दूसरी मशीन पर बिल्ड चलाएं और यह पक्का करें कि पहले चरण में किए गए बदलाव शामिल हैं:
bazel clean
bazel ... build ... --execution_log_binary_file=/tmp/exec2.log
दो रन के लिए एक्ज़ीक्यूशन लॉग की तुलना करें. अगर लॉग एक जैसे नहीं हैं, तो अंतर के लिए अपने बिल्ड कॉन्फ़िगरेशन की जांच करें. साथ ही, होस्ट एनवायरमेंट की उन प्रॉपर्टी की भी जांच करें जो किसी भी बिल्ड में लीक हो रही हैं.
एक्ज़ीक्यूशन लॉग की तुलना करना
एक्ज़ीक्यूशन लॉग में, बिल्ड के दौरान की गई सभी कार्रवाइयों के रिकॉर्ड होते हैं. हर कार्रवाई के लिए SpawnExec एलिमेंट होता है, जिसमें कार्रवाई कुंजी की पूरी जानकारी होती है. इसलिए, अगर लॉग एक जैसे हैं, तो ऐक्शन कैश कुंजियां भी मौजूद होंगी.
ऐसे दो बिल्ड के लॉग की तुलना करने के लिए जो उम्मीद के मुताबिक कैश हिट शेयर नहीं कर रहे हैं, यह तरीका अपनाएं:
हर बिल्ड से एक्ज़ीक्यूशन लॉग पाएं. साथ ही, उन्हें
/tmp/exec1.log
और/tmp/exec2.log
के तौर पर स्टोर करें.Bazel सोर्स कोड डाउनलोड करें और नीचे दिए गए कमांड का इस्तेमाल करके, Bazel फ़ोल्डर पर जाएं. आपको एक्ज़िकलॉग पार्सर से एक्ज़ीक्यूशन लॉग पार्स करने के लिए, सोर्स कोड की ज़रूरत होगी.
git clone https://github.com/bazelbuild/bazel.git cd bazel
लॉग को टेक्स्ट में बदलने के लिए, एक्ज़ीक्यूशन लॉग पार्सर का इस्तेमाल करें. नीचे दिया गया इनवोकेशन, दूसरे लॉग की कार्रवाइयों को भी क्रम से लगाता है, ताकि पहले लॉग में कार्रवाई के क्रम से मिलान करके आसानी से तुलना की जा सके.
bazel build src/tools/execlog:parser bazel-bin/src/tools/execlog/parser \ --log_path=/tmp/exec1.log \ --log_path=/tmp/exec2.log \ --output_path=/tmp/exec1.log.txt \ --output_path=/tmp/exec2.log.txt
/tmp/exec1.log.txt
और/tmp/exec2.log.txt
के बीच अंतर करने के लिए, अलग-अलग पसंदीदा टेक्स्ट का इस्तेमाल करें.