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