इस पेज पर, कैश हिट रेट की जांच करने और रिमोट एक्ज़ीक्यूशन के संदर्भ में कैश मिस की जांच करने का तरीका बताया गया है.
इस पेज पर यह माना गया है कि आपके पास कोई ऐसा बिल्ड और/या टेस्ट है जो रिमोट एक्ज़ीक्यूशन का इस्तेमाल करता है. साथ ही, आपको यह पक्का करना है कि आप रिमोट कैश का सही तरीके से इस्तेमाल कर रहे हैं.
कैश हिट रेट की जांच करना
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 cleanbazel --optional-flags build //your:target --execution_log_binary_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_binary_file=/tmp/exec1.logदूसरी मशीन पर बिल्ड चलाएं. पक्का करें कि पहले चरण में किया गया बदलाव शामिल हो:
bazel cleanbazel ... build ... --execution_log_binary_file=/tmp/exec2.logदोनों रन के एक्ज़ीक्यूशन लॉग की तुलना करें. अगर लॉग एक जैसे नहीं हैं, तो अपने बिल्ड कॉन्फ़िगरेशन में अंतरों की जांच करें. साथ ही, यह भी देखें कि होस्ट एनवायरमेंट की प्रॉपर्टी, किसी भी बिल्ड में लीक हो रही हैं या नहीं.
एक्ज़ीक्यूशन लॉग की तुलना करना
एक्ज़ीक्यूशन लॉग में, बिल्ड के दौरान एक्ज़ीक्यूट की गई सभी कार्रवाइयों के रिकॉर्ड होते हैं. हर कार्रवाई के लिए, एक SpawnExec एलिमेंट होता है. इसमें ऐक्शन की से जुड़ी सारी जानकारी होती है. इसलिए, अगर लॉग एक जैसे हैं, तो ऐक्शन कैश की भी एक जैसी होंगी.
अगर दो बिल्ड के लॉग की तुलना करनी है और आपको उम्मीद के मुताबिक कैश हिट नहीं मिल रहे हैं, तो यह तरीका अपनाएं:
हर बिल्ड से एक्ज़ीक्यूशन लॉग पाएं और उन्हें
/tmp/exec1.logऔर/tmp/exec2.logके तौर पर सेव करें.Bazel का सोर्स कोड डाउनलोड करें और नीचे दिए गए कमांड का इस्तेमाल करके, Bazel फ़ोल्डर पर जाएं. execlog पार्सर की मदद से, एक्ज़ीक्यूशन लॉग को पार्स करने के लिए, आपको सोर्स कोड की ज़रूरत होगी.
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में अंतर देखने के लिए, अपने पसंदीदा टेक्स्ट डिफ़र का इस्तेमाल करें.