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

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

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

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

कैश हिट रेट की जांच करना

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

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

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

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

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

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