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