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