रिमोट एक्ज़ीक्यूशन के लिए रिमोट कैश हिट को डीबग करना

समस्या की शिकायत करें सोर्स देखें

इस पेज पर कैश मेमोरी में सेव हुए हिट की दर देखने का तरीका बताया गया है. साथ ही, रिमोट तरीके से कैश मेमोरी में सेव नहीं हुई चीज़ों की जांच करने का तरीका बताया गया है.

इस पेज को यह माना जाता है कि आपके पास बिल्ड और/या टेस्ट है जो रिमोट एक्ज़ीक्यूशन को इस्तेमाल करता है. साथ ही, यह पक्का करना चाहता है कि आप रिमोट कैश का इस्तेमाल असरदार तरीके से कर रहे हैं.

आपकी कैश हिट दर की जांच की जा रही है

आपके बेज़ल दौड़ के मानक आउटपुट में, INFO पंक्ति को देखें, जिसमें ऐसी प्रक्रियाओं की सूची है, जो मोटे तौर पर बैज़ल की कार्रवाइयों से मिलती-जुलती हैं. उस पंक्ति का विवरण, जहां कार्रवाई चलाई गई थी. remote लेबल देखें, जो दूर से लागू की गई कार्रवाई, लोकल सैंडबॉक्स में एक्ज़ीक्यूट की गई linux-sandbox, और लागू करने की दूसरी रणनीतियों के लिए दूसरी वैल्यू दिखाता है. रिमोट कैश मेमोरी से मिली कार्रवाई, remote cache hit के तौर पर दिखती है.

उदाहरण के लिए:

INFO: 11 processes: 6 remote cache hit, 3 internal, 2 remote.

इस उदाहरण में, छह रिमोट कैश हिट मिले हैं और दो कार्रवाइयों में कैश हिट नहीं हैं. और इन्हें कहीं से भी चलाया गया है. तीन अंदरूनी हिस्से को अनदेखा किया जा सकता है. ये आम तौर पर छोटी-छोटी अंदरूनी कार्रवाइयां होती हैं, जैसे कि सिंबल वाले लिंक बनाना. इस खास जानकारी में लोकल कैश हिट शामिल नहीं हैं. अगर आपको एक भी प्रोसेस नहीं मिल रहा है (या उम्मीद से कम संख्या) तो bazel clean/इसके बाद अपना बिल्ड/टेस्ट कमांड चलाएं.

कैश हिट से जुड़ी समस्या हल करना

अगर आपको उम्मीद के मुताबिक कैश हिट की दर नहीं मिल रही है, तो ये करें:

पक्का करें कि बिल्ड/टेस्ट कमांड को फिर से चलाने से कैश हिट मिलें

  1. ऐसे बिल्ड और/या टेस्ट की जांच करें जिनकी कैश मेमोरी में अपने-आप जानकारी भरनी है. जब पहली बार किसी खास स्टैक पर कोई नया बिल्ड चलाया जाता है, तो आपको रिमोट कैश हिट की उम्मीद नहीं होती है. रिमोट तरीके से एक्ज़ीक्यूशन के दौरान, कार्रवाई के नतीजे कैश मेमोरी में सेव किए जाते हैं. साथ ही, उन्हें बाद में चलने पर भी पिक अप किया जा सकता है.

  2. bazel clean चलाएं. यह निर्देश आपके लोकल कैश को साफ़ करता है. इसकी मदद से, लोकल कैश हिट को मास्क किए बिना, नतीजों में रिमोट कैश हिट की जांच की जा सकती है.

  3. ऐसे बिल्ड और टेस्ट चलाएं जिनकी फिर से जांच हो रही है (उसी मशीन पर).

  4. कैश मेमोरी के हिट रेट के लिए, INFO लाइन देखें. अगर आपको remote cache hit और internal को छोड़कर, कोई और प्रोसेस नहीं दिखती है, तो इसका मतलब है कि आपकी कैश मेमोरी सही तरीके से भरी हुई है और उसे ऐक्सेस किया जा रहा है. ऐसे में, सीधे अगले सेक्शन पर जाएं.

  5. ऐसा हो सकता है कि बिल्ड में किसी तरह की गड़बड़ी न हो. इसकी वजह से दोनों रन में अलग-अलग ऐक्शन कुंजियां मिल सकती हैं. उन कार्रवाइयों को ढूंढने के लिए, ये काम करें:

    a. एक्ज़ीक्यूशन लॉग पाने के लिए, बिल्ड (या बिल्ड) को टेस्ट करें:

      bazel clean
      bazel --optional-flags build //your:target --execution_log_binary_file=/tmp/exec1.log
    

    b. दो रन के बीच एक्ज़ीक्यूशन लॉग की तुलना करें. पक्का करें कि दो लॉग फ़ाइलों में कार्रवाइयां एक जैसी हों. डेटा में अंतर से, इस बात का अंदाज़ा हो जाता है कि रन के बीच में क्या बदलाव हुए हैं. इन अंतर को हटाने के लिए अपने बिल्ड को अपडेट करें.

    अगर आपको कैश मेमोरी में सेव की गई समस्याओं को ठीक करने में मदद मिल रही है और अब बार-बार चलाने से सभी कैश हिट बन जाते हैं, तो सीधे अगले सेक्शन पर जाएं.

    अगर आपके ऐक्शन आईडी एक जैसे हैं, लेकिन कोई कैश हिट नहीं है, तो आपकी कॉन्फ़िगरेशन में मौजूद कोई चीज़ कैश करने को रोक रही है. सामान्य समस्याओं की जांच करने के लिए इस सेक्शन में आगे बढ़ें.

    अगर आपको एक्ज़ीक्यूशन लॉग को अलग करने की ज़रूरत नहीं है, तो इसके बजाय, मानव-पढ़ने लायक --execution_log_json_file फ़्लैग का इस्तेमाल किया जा सकता है. इसका इस्तेमाल स्थायी डिफ़रिंग के लिए नहीं किया जा सकता, क्योंकि इसमें एक्ज़ीक्यूशन का समय होता है और यह ऑर्डर की गारंटी नहीं है.

  6. जांच करें कि एक्ज़ीक्यूशन लॉग में सभी कार्रवाइयों को सही पर cacheable सेट किया गया है. cacheable देने की कार्रवाई के लिए एक्ज़ीक्यूशन लॉग में नहीं दिखता है, तो इसका मतलब है कि उससे जुड़े नियम की BUILD फ़ाइल में, उसकी परिभाषा में no-cache टैग हो सकता है. एक्ज़ीक्यूट करने के लॉग में लोगों के पढ़ने लायक progress_message फ़ील्ड देखें और पता करें कि कार्रवाई कहां से की जा रही है.

  7. अगर 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 फ़ाइल में.

सभी डिवाइसों पर कैश मेमोरी को पक्का करना

एक ही मशीन पर उम्मीद के मुताबिक कैश हिट होने के बाद, अलग-अलग मशीन पर वही बिल्ड/टेस्ट चलाएं. अगर आपको लगता है कि मशीनों में कैश मेमोरी नहीं जा रही है, तो ये काम करें:

  1. मौजूदा कैश मेमोरी में जाने से बचने के लिए, अपने बिल्ड में मामूली बदलाव करें.

  2. पहली मशीन पर बिल्ड चलाएं:

     bazel clean
     bazel ... build ... --execution_log_binary_file=/tmp/exec1.log
    
  3. दूसरी मशीन पर बिल्ड चलाएं और पक्का करें कि पहले चरण में किया गया बदलाव शामिल है:

     bazel clean
     bazel ... build ... --execution_log_binary_file=/tmp/exec2.log
    
  4. दो रन के लिए, एक्ज़ीक्यूशन लॉग की तुलना करें. अगर लॉग एक जैसे नहीं हैं, तो दोनों में से किसी भी बिल्ड में मौजूद होस्ट एनवायरमेंट से प्रॉपर्टी और अंतर के लिए, अपने बिल्ड कॉन्फ़िगरेशन की जांच करें.

एक्ज़ीक्यूशन लॉग की तुलना करना

एक्ज़ीक्यूशन लॉग में बिल्ड के दौरान की गई सभी कार्रवाइयों के रिकॉर्ड होते हैं. हर कार्रवाई के लिए, एक SpawnExec एलिमेंट होता है, जिसमें कार्रवाई कुंजी की सारी जानकारी होती है. इसलिए, अगर लॉग एक जैसे हैं, तो ऐक्शन कैश कुंजी भी हैं.

दो बिल्ड के लिए लॉग की तुलना, जो उम्मीद के मुताबिक कैश हिट शेयर नहीं कर रहे हैं, ये करें:

  1. हर बिल्ड पर लागू होने वाले लॉग पाएं और उन्हें /tmp/exec1.log और /tmp/exec2.log के तौर पर सेव करें.

  2. Bazel का सोर्स कोड डाउनलोड करें और नीचे दिए गए निर्देश का इस्तेमाल करके, Bazel फ़ोल्डर पर जाएं. एक्ज़ीक्यूशन लॉग को execlog पार्सर से पार्स करने के लिए, आपको सोर्स कोड की ज़रूरत पड़ेगी.

    git clone https://github.com/bazelbuild/bazel.git
    cd bazel
    
  3. लॉग को टेक्स्ट में बदलने के लिए, एक्ज़ीक्यूशन लॉग पार्सर का इस्तेमाल करें. नीचे दिए गए तरीके से शुरू करने पर, दूसरे लॉग में मौजूद कार्रवाइयों को भी क्रम में लगाया जाता है. वे आसानी से तुलना करने के लिए, पहले लॉग में कार्रवाई के क्रम से मेल खाते हैं.

    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
    
  4. /tmp/exec1.log.txt और /tmp/exec2.log.txt के बीच के अंतर के लिए, अपने पसंदीदा टेक्स्ट का इस्तेमाल करें.