রিমোট এক্সিকিউশনের জন্য রিমোট ক্যাশে হিট ডিবাগ করা

এই পৃষ্ঠাটি বর্ণনা করে যে কীভাবে আপনার ক্যাশে হিট রেট চেক করবেন এবং রিমোট এক্সিকিউশনের প্রসঙ্গে ক্যাশে মিস কীভাবে তদন্ত করবেন।

এই পৃষ্ঠাটি অনুমান করে যে আপনার একটি বিল্ড এবং/অথবা পরীক্ষা রয়েছে যা সফলভাবে দূরবর্তী এক্সিকিউশন ব্যবহার করে এবং আপনি নিশ্চিত করতে চান যে আপনি দূরবর্তী ক্যাশে কার্যকরভাবে ব্যবহার করছেন।

আপনার ক্যাশে হিট রেট পরীক্ষা করা হচ্ছে

আপনার Bazel রানের স্ট্যান্ডার্ড আউটপুটে, INFO লাইনটি দেখুন যা প্রসেস তালিকাভুক্ত করে, যা মোটামুটিভাবে Bazel অ্যাকশনের সাথে মিলে যায়। সেই লাইনের বিবরণ যেখানে অ্যাকশন চালানো হয়েছিল। remote লেবেলটি সন্ধান করুন, যা দূরবর্তীভাবে সম্পাদিত একটি ক্রিয়া নির্দেশ করে, স্থানীয় স্যান্ডবক্সে সম্পাদিত ক্রিয়াগুলির জন্য linux-sandbox এবং অন্যান্য কার্যকরী কৌশলগুলির জন্য অন্যান্য মানগুলি। একটি কর্ম যার ফলাফল একটি দূরবর্তী ক্যাশে থেকে এসেছে তা remote cache hit হিসাবে প্রদর্শিত হয়৷

উদাহরণ স্বরূপ:

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

এই উদাহরণে 6টি রিমোট ক্যাশে হিট ছিল এবং 2টি অ্যাকশনে ক্যাশে হিট ছিল না এবং দূরবর্তীভাবে চালানো হয়েছিল৷ 3টি অভ্যন্তরীণ অংশ উপেক্ষা করা যেতে পারে। এটি সাধারণত ছোট অভ্যন্তরীণ ক্রিয়া, যেমন প্রতীকী লিঙ্ক তৈরি করা। স্থানীয় ক্যাশে হিট এই সারাংশ অন্তর্ভুক্ত করা হয় না. আপনি যদি 0 প্রসেস (অথবা প্রত্যাশিত সংখ্যার চেয়ে কম) পেয়ে থাকেন তবে আপনার বিল্ড/টেস্ট কমান্ড অনুসরণ করে bazel clean চালান।

ক্যাশে হিট সমস্যা সমাধান

আপনি যদি ক্যাশে হিট রেট না পেয়ে থাকেন যা আপনি আশা করছেন, তাহলে নিম্নলিখিতগুলি করুন:

নিশ্চিত করুন একই বিল্ড/টেস্ট কমান্ড পুনরায় চালানোর ফলে ক্যাশে হিট তৈরি হয়

  1. বিল্ড(গুলি) এবং/অথবা পরীক্ষা(গুলি) চালান যা আপনি ক্যাশে পপুলেট করার আশা করছেন৷ প্রথমবার একটি নতুন বিল্ড একটি নির্দিষ্ট স্ট্যাকে চালানো হয়, আপনি কোন দূরবর্তী ক্যাশে হিট আশা করতে পারেন। রিমোট এক্সিকিউশনের অংশ হিসেবে, অ্যাকশনের ফলাফল ক্যাশে সংরক্ষণ করা হয় এবং পরবর্তী রানের জন্য সেগুলি তুলে নেওয়া উচিত।

  2. bazel clean চালান। এই কমান্ডটি আপনার স্থানীয় ক্যাশে পরিষ্কার করে, যা আপনাকে স্থানীয় ক্যাশে হিট দ্বারা মাস্ক করা ফলাফলগুলি ছাড়াই দূরবর্তী ক্যাশে হিটগুলি তদন্ত করতে দেয়।

  3. বিল্ড(গুলি) এবং পরীক্ষা(গুলি) চালান যা আপনি আবার তদন্ত করছেন (একই মেশিনে)।

  4. ক্যাশে হিট হারের জন্য INFO লাইন চেক করুন। আপনি যদি remote cache hit এবং internal ছাড়া কোনো প্রক্রিয়া দেখতে না পান, তাহলে আপনার ক্যাশে সঠিকভাবে জনবহুল এবং অ্যাক্সেস করা হচ্ছে। সেই ক্ষেত্রে, পরবর্তী বিভাগে যান।

  5. অসঙ্গতির একটি সম্ভাব্য উৎস হল বিল্ডে এমন কিছু নন-হর্মেটিক যার ফলে অ্যাকশন দুটি রান জুড়ে বিভিন্ন অ্যাকশন কী পেতে পারে। এই ক্রিয়াগুলি খুঁজে পেতে, নিম্নলিখিতগুলি করুন:

    ক এক্সিকিউশন লগগুলি পেতে প্রশ্নে বিল্ড(গুলি) বা পরীক্ষা(গুলি) পুনরায় চালান:

      bazel clean
      bazel --optional-flags build //your:target --execution_log_binary_file=/tmp/exec1.log
    

    খ. দুটি রানের মধ্যে এক্সিকিউশন লগ তুলনা করুন । দুটি লগ ফাইল জুড়ে কর্মগুলি অভিন্ন তা নিশ্চিত করুন। পার্থক্যগুলি রানের মধ্যে ঘটে যাওয়া পরিবর্তনগুলি সম্পর্কে একটি সূত্র প্রদান করে। সেই অসঙ্গতিগুলি দূর করতে আপনার বিল্ড আপডেট করুন।

    আপনি যদি ক্যাশিং সমস্যাগুলি সমাধান করতে সক্ষম হন এবং এখন বারবার চালানো সমস্ত ক্যাশে হিট তৈরি করে তবে পরবর্তী বিভাগে যান।

    যদি আপনার অ্যাকশন আইডি একই রকম হয় কিন্তু কোনো ক্যাশে হিট না থাকে, তাহলে আপনার কনফিগারেশনের কিছু ক্যাশিং প্রতিরোধ করছে। সাধারণ সমস্যাগুলি পরীক্ষা করতে এই বিভাগটি চালিয়ে যান।

    আপনার যদি এক্সিকিউশন লগ আলাদা করার প্রয়োজন না হয়, আপনি এর পরিবর্তে মানব-পাঠযোগ্য --execution_log_json_file পতাকা ব্যবহার করতে পারেন। এটি স্থিতিশীল পার্থক্যের জন্য ব্যবহার করা যাবে না কারণ এতে কার্যকর করার সময় রয়েছে এবং অর্ডার দেওয়ার গ্যারান্টি দেয় না।

  6. এক্সিকিউশন লগের সমস্ত অ্যাকশন cacheable সেট করা আছে কিনা তা পরীক্ষা করুন। যদি cacheable একটি গিভ অ্যাকশনের জন্য এক্সিকিউশন লগে উপস্থিত না হয়, তাহলে এর মানে হল যে সংশ্লিষ্ট নিয়মের BUILD ফাইলের সংজ্ঞায় একটি no-cache ট্যাগ থাকতে পারে। কর্মটি কোথা থেকে আসছে তা নির্ধারণে সহায়তা করতে এক্সিকিউশন লগে মানব-পাঠযোগ্য progress_message ক্ষেত্রটি দেখুন।

  7. যদি ক্রিয়াগুলি অভিন্ন এবং cacheable হয় কিন্তু কোন ক্যাশে হিট না থাকে, তাহলে এটা সম্ভব যে আপনার কমান্ড লাইনে --noremote_accept_cached অন্তর্ভুক্ত রয়েছে যা একটি বিল্ডের জন্য ক্যাশে লুকআপ নিষ্ক্রিয় করবে।

    প্রকৃত কমান্ড লাইন বের করা কঠিন হলে, বিল্ড ইভেন্ট প্রোটোকল থেকে ক্যানোনিকাল কমান্ড লাইনটি নিম্নরূপ ব্যবহার করুন:

    ক লগের পাঠ্য সংস্করণ পেতে আপনার Bazel কমান্ডে --build_event_text_file=/tmp/bep.txt যোগ করুন।

    খ. লগের পাঠ্য সংস্করণটি খুলুন এবং কমান্ড_লাইন_লেবেল সহ structured_command_line বার্তাটি অনুসন্ধান করুন command_line_label: "canonical" । এটি সম্প্রসারণের পরে সমস্ত বিকল্প তালিকাভুক্ত করবে।

    গ. 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. দ্বিতীয় মেশিনে বিল্ডটি চালান, ধাপ 1 থেকে পরিবর্তনটি অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করে:

     bazel clean
     bazel ... build ... --execution_log_binary_file=/tmp/exec2.log
    
  4. দুটি রানের জন্য মৃত্যুদন্ডের লগ তুলনা করুন । লগগুলি অভিন্ন না হলে, হোস্ট এনভায়রনমেন্ট থেকে বিল্ডগুলির যেকোন একটিতে লিক হওয়া অসঙ্গতির জন্য আপনার বিল্ড কনফিগারেশনগুলি তদন্ত করুন।

মৃত্যুদন্ড লগ তুলনা

এক্সিকিউশন লগগুলিতে বিল্ডের সময় সম্পাদিত সমস্ত কর্মের রেকর্ড থাকে। প্রতিটি অ্যাকশনের জন্য একটি SpawnExec উপাদান থাকে যাতে অ্যাকশন কী থেকে সমস্ত তথ্য থাকে, এইভাবে, যদি লগগুলি অভিন্ন হয় তবে অ্যাকশন ক্যাশে কীগুলিও একই রকম।

দুটি বিল্ডের লগ তুলনা করতে যা প্রত্যাশা অনুযায়ী ক্যাশে হিট ভাগ করছে না, নিম্নলিখিতগুলি করুন:

  1. প্রতিটি বিল্ড থেকে এক্সিকিউশন লগগুলি পান এবং সেগুলিকে /tmp/exec1.log এবং /tmp/exec2.log হিসাবে সংরক্ষণ করুন।

  2. Bazel সোর্স কোড ডাউনলোড করুন এবং নীচের কমান্ড ব্যবহার করে Bazel ফোল্ডারে নেভিগেট করুন। 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. আপনার প্রিয় পাঠ্যটি diff /tmp/exec1.log.txt এবং /tmp/exec2.log.txt ব্যবহার করুন।