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

किसी समस्या की शिकायत करें सोर्स देखें Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

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

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

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_compact_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. लॉग का टेक्स्ट वर्शन खोलें और structured_command_linecommand_line_label: "canonical" वाला मैसेज खोजें. एक्सपैंशन के बाद, इसमें सभी विकल्प दिखेंगे.

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

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

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

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

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

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

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

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

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

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

एक्सीक्यूशन लॉग को तीन में से किसी एक फ़ॉर्मैट में बनाया जा सकता है: कॉम्पैक्ट (--execution_log_compact_file), बाइनरी (--execution_log_binary_file) या JSON (--execution_log_json_file). कॉम्पैक्ट फ़ॉर्मैट का सुझाव दिया जाता है, क्योंकि इससे बहुत कम रनटाइम ओवरहेड के साथ बहुत छोटी फ़ाइलें बनती हैं. नीचे दिए गए निर्देश किसी भी फ़ॉर्मैट के लिए काम करते हैं. //src/tools/execlog:converter टूल का इस्तेमाल करके भी खातों को आपस में बदला जा सकता है.

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

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

  2. Basel सोर्स कोड डाउनलोड करें और //src/tools/execlog:parser टूल बनाएं:

    git clone https://github.com/ba Profilebuild/baZ.git cd ba सुझावों का इस्तेमाल करें.

  3. लॉग को ऐसे टेक्स्ट फ़ॉर्मैट में बदलने के लिए //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. diff /tmp/exec1.log.txt और /tmp/exec2.log.txt के लिए, अपने पसंदीदा टेक्स्ट differ का इस्तेमाल करें.