इस पेज पर बताया गया है कि कैश मेमोरी के हिट की दर की जांच कैसे करें और इसकी जांच कैसे करें रिमोट एक्ज़ीक्यूशन के दौरान कैश मेमोरी में सेव गड़बड़ी होती है.
यह पेज मानता है कि आपके पास एक बिल्ड और/या टेस्ट है जो रिमोट तरीके से एक्ज़ीक्यूट किया जा सकता है. साथ ही, आपको यह पक्का करना है कि रिमोट कैश मेमोरी का इस्तेमाल करके.
कैश मेमोरी का हिट रेट देखना
अपने Basel रन के स्टैंडर्ड आउटपुट में, वह INFO
लाइन देखें जिसमें
प्रोसेस के बारे में बताती हैं, जो मोटे तौर पर Basel की कार्रवाइयों से जुड़ी होती हैं. उस लाइन की जानकारी
जहां कार्रवाई की गई थी. remote
लेबल खोजें. यह लेबल, कार्रवाई के बारे में बताता है
रिमोट तौर पर चलाया जा सकता है, लोकल सैंडबॉक्स में की गई कार्रवाइयों के लिए linux-sandbox
,
और एक्ज़ीक्यूशन की अन्य रणनीतियों के लिए अन्य वैल्यू. वह कार्रवाई जिसका नतीजा मिला
रिमोट कैश मेमोरी में सेव की गई कॉपी को remote cache hit
के तौर पर दिखाया जाता है.
उदाहरण के लिए:
INFO: 11 processes: 6 remote cache hit, 3 internal, 2 remote.
इस उदाहरण में 6 रिमोट कैश हिट थे और 2 कार्रवाइयों में ऐसा नहीं था
कैश मेमोरी हिट को एक्सपोर्ट किया गया और उन्हें दूर से ही एक्ज़ीक्यूट किया गया. तीन अंदरूनी हिस्से को अनदेखा किया जा सकता है.
आम तौर पर, इसमें अंदरूनी कार्रवाइयां छोटी होती हैं. जैसे, सिंबल के तौर पर लिंक बनाना. लोकल कैंपेन
इस खास जानकारी में कैश मेमोरी हिट शामिल नहीं किए जाते. अगर आपको कोई भी प्रोसेस नहीं मिल रही है
(या उम्मीद से कम संख्या), bazel clean
चलाएं. इसके बाद, बिल्ड/टेस्ट करें
आदेश.
कैश मेमोरी हिट से जुड़ी समस्या हल करना
अगर आपको कैश मेमोरी का हिट रेट अपनी उम्मीद के मुताबिक नहीं मिल रहा है, तो ये काम करें:
पक्का करें कि उसी बिल्ड/टेस्ट निर्देश को फिर से चलाने से कैश मेमोरी हिट मिल रहे हों
वे बिल्ड और/या टेस्ट चलाएं जिनसे आपको कैश मेमोरी में अपने-आप जानकारी भरनी हो. कॉन्टेंट बनाने जब किसी खास स्टैक पर पहली बार नया बिल्ड चलाया जाता है, तो हो सकता है कि कोई रिमोट कैश मेमोरी हिट. रिमोट तरीके से एक्ज़ीक्यूट करने की सुविधा की मदद से, कार्रवाई के नतीजे यहां सेव किए जाते हैं कैश मेमोरी में सेव किया जा सकता है और बाद में चलाए जाने पर उन्हें इस्तेमाल किया जा सकता है.
bazel clean
चलाएं. इस निर्देश से आपकी लोकल कैश मेमोरी मिट जाती है, जिससे की मदद से, रिमोट कैश मेमोरी हिट की जांच की जा सकती है. ऐसा करने पर, नतीजों को लोकल कैश मेमोरी से मिले हिट के बारे में बताता है.वे बिल्ड और टेस्ट फिर से चलाएं जिनकी जांच आप फिर से कर रहे हैं (उसी पर) मशीन).
कैश मेमोरी हिट रेट के बारे में जानने के लिए,
INFO
लाइन देखें. अगर आपको इसके अलावा कोई प्रोसेस नहीं दिखती हैremote cache hit
औरinternal
, तो आपकी कैश मेमोरी सही तरीके से भरी जा रही है और ऐक्सेस किया गया. इस स्थिति में, सीधे अगले सेक्शन पर जाएं.अंतर की वजह यह है कि बिल्ड में कोई अंतर नहीं है और इसकी वजह से कार्रवाई करें. ढूंढने के लिए तो ये कार्रवाइयां करें:
a. एक्ज़ीक्यूशन लॉग पाने के लिए, बिल्ड या टेस्ट को फिर से चलाएं:
bazel clean
bazel --optional-flags build //your:target --execution_log_binary_file=/tmp/exec1.log
b. एक्ज़ीक्यूशन लॉग की तुलना दो रन. पक्का करें कि सभी दो लॉग फ़ाइलों में कार्रवाइयां एक जैसी हैं. अंतरों से पता चलता है कि दौड़ता है. इन गड़बड़ियों को खत्म करने के लिए, अपने बिल्ड अपडेट करें.
यदि आप कैशिंग समस्याओं को हल करने में सक्षम हैं और अब बार-बार रन करना है सभी कैश हिट जनरेट करता है, तो अगले सेक्शन पर जाएं.
अगर आपके ऐक्शन आईडी एक जैसे हैं, लेकिन कैश मेमोरी हिट नहीं हैं, तो कुछ आपके कॉन्फ़िगरेशन में, कैश मेमोरी में डेटा सेव होने से रोका जा रहा है. इस सेक्शन के साथ जारी रखें सामान्य समस्याओं की जांच करें.
अगर आपको एक्ज़ीक्यूशन लॉग में फ़र्क़ करने की ज़रूरत नहीं है, तो इसके बजाय,
--execution_log_json_file
फ़्लैग का इस्तेमाल किया जा सकता है, जिसे कोई भी व्यक्ति आसानी से पढ़ सकता है. यह नहीं हो सकता इसका इस्तेमाल स्थायी डिफ़रेंस के लिए किया जाता है क्योंकि इसमें एक्ज़ीक्यूशन का समय होता है और नहीं होता गारंटी के साथ ऑर्डर करें.देखें कि एक्ज़ीक्यूशन लॉग में सभी कार्रवाइयों के लिए,
cacheable
को 'सही' पर सेट किया गया है. अगर आपनेcacheable
किसी कार्रवाई के लिए एक्ज़ीक्यूशन लॉग में नहीं दिखता, क्योंकि का मतलब है कि संबंधित नियम मेंno-cache
टैग हो सकता हैBUILD
फ़ाइल में दी गई परिभाषा. ऐसेprogress_message
देखें जिन्हें कोई भी व्यक्ति आसानी से पढ़ सकता है एक्ज़ीक्यूशन लॉग में फ़ील्ड का इस्तेमाल करें, ताकि यह तय किया जा सके कि कार्रवाई कहां से हो रही है.अगर कार्रवाइयां एक जैसी हैं और
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
पर सेट करें: कमांड लाइन पर या baज़ेनrc फ़ाइल में.
यह पक्का करें कि सभी मशीनों को कैश मेमोरी में सेव किया जा रहा हो
एक ही मशीन पर कैश मेमोरी हिट होने के बाद, किसी दूसरी मशीन पर एक ही बिल्ड/टेस्ट. अगर आपको लगता है कि कैश मेमोरी में सेव किया गया है ऐसा न हो, तो ये काम करें:
मौजूदा कैश मेमोरी को नुकसान पहुंचने से बचने के लिए, अपने बिल्ड में छोटा सा बदलाव करें.
बिल्ड को पहली मशीन पर चलाएं:
bazel clean
bazel ... build ... --execution_log_binary_file=/tmp/exec1.log
पहले चरण में हुए बदलाव को पक्का करते हुए, बिल्ड को दूसरी मशीन पर चलाएं शामिल है:
bazel clean
bazel ... build ... --execution_log_binary_file=/tmp/exec2.log
दोनों के लिए एक्ज़िक्यूशन लॉग की तुलना करें दौड़ता है. अगर लॉग एक जैसे नहीं हैं, तो अपने बिल्ड कॉन्फ़िगरेशन की जांच करें और होस्ट एनवायरमेंट के लीक होने से जुड़ी गड़बड़ियों के साथ-साथ दोनों में से किसी भी एक बिल्ड में इस्तेमाल किया जा सकता है.
एक्ज़ीक्यूशन लॉग की तुलना करना
एक्ज़ीक्यूशन लॉग में, बिल्ड के दौरान की गई सभी कार्रवाइयों के रिकॉर्ड होते हैं. इसके लिए हर कार्रवाई SpawnExec वह एलीमेंट जिसमें कार्रवाई कुंजी की सभी जानकारी शामिल है, इसलिए, अगर लॉग एक जैसे होते हैं और ऐक्शन कैश बटन भी एक जैसे होते हैं.
उम्मीद के मुताबिक कैश हिट शेयर नहीं करने वाले दो बिल्ड के लॉग की तुलना करने के लिए, ये काम करें:
हर बिल्ड से एक्ज़ीक्यूशन लॉग पाएं और उन्हें
/tmp/exec1.log
के तौर पर सेव करें और/tmp/exec2.log
.Basel सोर्स कोड डाउनलोड करें और देखने के लिए नीचे दिया गया तरीका अपनाएं. इसे पार्स करने के लिए आपको सोर्स कोड की ज़रूरत होगी एक्ज़ीक्यूशन लॉग execlog पार्सर.
git clone https://github.com/bazelbuild/bazel.git cd bazel
लॉग को टेक्स्ट में बदलने के लिए, एक्ज़ीक्यूशन लॉग पार्सर का इस्तेमाल करें. नीचे दिए गए शुरू करने की सुविधा, कार्रवाई के क्रम से मैच करने के लिए दूसरे लॉग में भी कार्रवाइयों को क्रम से लगाती है तुलना करने में आसानी के लिए, पहले लॉग में जोड़ें.
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
/tmp/exec1.log.txt
और में अंतर के हिसाब से अपने पसंदीदा टेक्स्ट का इस्तेमाल करें/tmp/exec2.log.txt
.