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

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

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

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

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

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

    b. लॉग का टेक्स्ट वर्शन खोलें और command_line_label: "canonical" की मदद से structured_command_line मैसेज खोजें. एक्सपैंशन के बाद, इसमें सभी विकल्प दिखेंगे.

    c. remote_accept_cached खोजें और देखें कि वह false पर सेट है या नहीं.

    d. अगर remote_accept_cached, false है, तो तय करें कि इसे false पर कहां सेट किया जा रहा है: कमांड लाइन पर या bazzrc फ़ाइल में.

यह पक्का करें कि सभी मशीनों को कैश मेमोरी में सेव किया जा रहा हो

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

  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. नीचे दिए गए निर्देश का इस्तेमाल करके, Basel सोर्स कोड डाउनलोड करें और Basel फ़ोल्डर पर जाएं. एक्ज़ीक्यूशन लॉग को 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 में फ़र्क़ करने के लिए, अपने पसंदीदा टेक्स्ट का इस्तेमाल करें.