इस पेज पर, कैश हिट रेट की जांच करने और रिमोट एक्ज़ीक्यूशन के संदर्भ में कैश मिस की जांच करने का तरीका बताया गया है.
इस पेज पर यह माना गया है कि आपके पास कोई ऐसा बिल्ड और/या टेस्ट है जो रिमोट एक्ज़ीक्यूशन का इस्तेमाल करता है. साथ ही, आपको यह पक्का करना है कि आप रिमोट कैश का सही तरीके से इस्तेमाल कर रहे हैं.
कैश हिट रेट की जांच करना
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. दोनों रन के एक्ज़ीक्यूशन लॉग की तुलना करें. पक्का करें कि दोनों लॉग फ़ाइलों में कार्रवाइयां एक जैसी हों. गड़बड़ियों से यह पता चलता है कि रन के बीच क्या बदलाव हुए हैं. उन गड़बड़ियों को ठीक करने के लिए, अपने बिल्ड को अपडेट करें.
अगर आपने कैशिंग से जुड़ी समस्याएं हल कर ली हैं और अब बार-बार रन करने पर सभी कैश हिट जनरेट हो रहे हैं, तो अगले सेक्शन पर जाएं.
अगर आपकी कार्रवाई की आईडी एक जैसी हैं, लेकिन कोई कैश हिट नहीं है, तो इसका मतलब है कि आपके कॉन्फ़िगरेशन में कोई समस्या है. इसकी वजह से, कैशिंग नहीं हो रही है. आम तौर पर होने वाली समस्याओं की जांच करने के लिए, इस सेक्शन को पढ़ें.
अगर आपको एक्ज़ीक्यूशन लॉग में अंतर नहीं देखना है, तो इसके बजाय,
--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. लॉग का टेक्स्ट वर्शन खोलें और
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में अंतर देखने के लिए, अपने पसंदीदा टेक्स्ट डिफ़र का इस्तेमाल करें.