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

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

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

कैश हिट रेट देखना

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

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

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

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

    अगर आपको सही कमांड लाइन का पता लगाने में मुश्किल हो रही है, तो Build Event Protocol से मिली कैननिकल कमांड लाइन का इस्तेमाल करें. इसके लिए, यहां दिया गया तरीका अपनाएं:

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

सभी मशीनों पर कैश मेमोरी की सुविधा चालू करना

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

  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 parser की मदद से, आपको एक्ज़ीक्यूशन लॉग पार्स करने के लिए सोर्स कोड की ज़रूरत होती है.

    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 में अंतर देखने के लिए, अपने पसंदीदा टेक्स्ट डिफ़र का इस्तेमाल करें.