ডায়নামিক এক্সিকিউশন 0.21 সংস্করণ থেকে Bazel-এ একটি বৈশিষ্ট্য, যেখানে একই অ্যাকশনের স্থানীয় এবং দূরবর্তী এক্সিকিউশন সমান্তরালভাবে শুরু হয়, প্রথম শাখা থেকে আউটপুট ব্যবহার করে যা শেষ হয়, অন্য শাখাটি বাতিল করে। এটি কার্যকর করার ক্ষমতা এবং/অথবা একটি রিমোট বিল্ড সিস্টেমের বৃহৎ শেয়ার্ড ক্যাশে স্থানীয় নির্বাহের কম বিলম্বের সাথে একত্রিত করে, একইভাবে পরিষ্কার এবং ক্রমবর্ধমান বিল্ডের জন্য উভয় জগতের সেরা প্রদান করে।
এই পৃষ্ঠাটি বর্ণনা করে যে কিভাবে সক্রিয়, টিউন এবং ডিবাগ ডায়নামিক এক্সিকিউশন করা যায়। আপনি যদি স্থানীয় এবং দূরবর্তী উভয়ই এক্সিকিউশন সেট আপ করে থাকেন এবং আরও ভাল পারফরম্যান্সের জন্য Bazel সেটিংস সামঞ্জস্য করার চেষ্টা করছেন, এই পৃষ্ঠাটি আপনার জন্য। আপনি যদি ইতিমধ্যেই রিমোট এক্সিকিউশন সেট আপ না করে থাকেন, তাহলে প্রথমে Bazel রিমোট এক্সিকিউশন ওভারভিউতে যান।
গতিশীল মৃত্যুদন্ড সক্রিয় করা হচ্ছে?
ডায়নামিক এক্সিকিউশন মডিউলটি Bazel-এর অংশ, কিন্তু ডায়নামিক এক্সিকিউশন ব্যবহার করার জন্য, আপনি ইতিমধ্যেই একই Bazel সেটআপ থেকে স্থানীয়ভাবে এবং দূরবর্তীভাবে উভয় কম্পাইল করতে সক্ষম হবেন।
ডায়নামিক এক্সিকিউশন মডিউল সক্রিয় করতে, Bazel-এ --internal_spawn_scheduler
পতাকা পাস করুন। এটি dynamic
নামে একটি নতুন এক্সিকিউশন কৌশল যুক্ত করে। আপনি এখন এটিকে আপনার কৌশল হিসাবে ব্যবহার করতে পারেন স্মৃতিবিদ্যার জন্য যেগুলি আপনি গতিশীলভাবে চালাতে চান, যেমন --strategy=Javac=dynamic
। ডায়নামিক এক্সিকিউশন সক্ষম করতে কোন স্মৃতিবিদ্যা কীভাবে বেছে নেবেন তার পরবর্তী বিভাগটি দেখুন।
ডায়নামিক স্ট্র্যাটেজি ব্যবহার করে যেকোন স্মৃতির জন্য, দূরবর্তী এক্সিকিউশন কৌশলগুলি --dynamic_remote_strategy
পতাকা থেকে এবং স্থানীয় কৌশলগুলি --dynamic_local_strategy
পতাকা থেকে নেওয়া হয়। পাস --dynamic_local_strategy=worker,sandboxed
কর্মীদের সাথে চেষ্টা করার জন্য ডায়নামিক এক্সিকিউশনের স্থানীয় শাখার জন্য ডিফল্ট সেট করে বা সেই ক্রমে স্যান্ডবক্সড এক্সিকিউশন। পাস --dynamic_local_strategy=Javac=worker
শুধুমাত্র Javac mnemonic-এর জন্য ডিফল্ট ওভাররাইড করে। দূরবর্তী সংস্করণ একই ভাবে কাজ করে। উভয় পতাকা একাধিকবার নির্দিষ্ট করা যেতে পারে। যদি একটি ক্রিয়া স্থানীয়ভাবে কার্যকর করা না যায়, তবে এটি দূরবর্তীভাবে স্বাভাবিক হিসাবে কার্যকর করা হয় এবং এর বিপরীতে।
যদি আপনার দূরবর্তী সিস্টেমে একটি ক্যাশে থাকে, দূরবর্তী সিস্টেম একটি ক্যাশে আঘাত নির্দেশ করার পরে --local_execution_delay
পতাকা স্থানীয় এক্সিকিউশনে মিলিসেকেন্ডে বিলম্ব যোগ করে। আরও ক্যাশে হিট হওয়ার সম্ভাবনা থাকলে এটি স্থানীয় এক্সিকিউশন চালানো এড়িয়ে যায়। ডিফল্ট মান হল 1000ms, কিন্তু ক্যাশে হিট সাধারণত নেওয়ার চেয়ে একটু বেশি লম্বা হওয়ার জন্য টিউন করা উচিত। প্রকৃত সময় রিমোট সিস্টেম এবং একটি রাউন্ড-ট্রিপ কতক্ষণ লাগে উভয়ের উপর নির্ভর করে। সাধারণত, একটি প্রদত্ত রিমোট সিস্টেমের সমস্ত ব্যবহারকারীর জন্য মান একই হবে, যদি না তাদের মধ্যে কিছু রাউন্ডট্রিপ লেটেন্সি যোগ করার জন্য যথেষ্ট দূরে থাকে। সাধারণ ক্যাশে হিট কত সময় নেয় তা দেখতে আপনি Bazel প্রোফাইলিং বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন।
ডায়নামিক এক্সিকিউশন স্থানীয় স্যান্ডবক্সড কৌশলের পাশাপাশি অবিরাম কর্মীদের সাথে ব্যবহার করা যেতে পারে। স্থির কর্মীরা যখন গতিশীল কার্য সম্পাদনের সাথে ব্যবহার করা হয় তখন স্বয়ংক্রিয়ভাবে স্যান্ডবক্সিং দিয়ে চলবে এবং মাল্টিপ্লেক্স কর্মীদের ব্যবহার করতে পারবে না৷ ডারউইন এবং উইন্ডোজ সিস্টেমে, স্যান্ডবক্সযুক্ত কৌশল ধীর হতে পারে; এই সিস্টেমে স্যান্ডবক্স তৈরির ওভারহেড কমাতে আপনি --reuse_sandbox_directories
পাস করতে পারেন।
ডাইনামিক এক্সিকিউশনও standalone
কৌশলের সাথে চলতে পারে, যদিও যেহেতু standalone
কৌশলটি কার্যকর করা শুরু করার সময় আউটপুট লক নিতে হবে, তাই এটি কার্যকরভাবে দূরবর্তী কৌশলটিকে প্রথম শেষ করা থেকে ব্লক করে। --experimental_local_lockfree_output
ফ্ল্যাগ স্থানীয় এক্সিকিউশনকে সরাসরি আউটপুটে লেখার অনুমতি দিয়ে এই সমস্যার সমাধান করে, কিন্তু রিমোট এক্সিকিউশন দ্বারা বাতিল করা হয়, যদি এটি প্রথমে শেষ হয়।
যদি ডায়নামিক এক্সিকিউশনের একটি শাখা প্রথম শেষ হয় কিন্তু ব্যর্থ হয়, তাহলে পুরো ক্রিয়া ব্যর্থ হয়। এটি একটি ইচ্ছাকৃত পছন্দ যাতে স্থানীয় এবং দূরবর্তী এক্সিকিউশনের মধ্যে পার্থক্য অলক্ষিত না হয়।
ডায়নামিক এক্সিকিউশন এবং এর লকিং কীভাবে কাজ করে সে সম্পর্কে আরও পটভূমির জন্য, জুলিও মেরিনোর চমৎকার ব্লগ পোস্টগুলি দেখুন
আমি কখন গতিশীল মৃত্যুদন্ড ব্যবহার করব?
ডায়নামিক এক্সিকিউশনের জন্য রিমোট এক্সিকিউশন সিস্টেমের কিছু ফর্ম প্রয়োজন। ক্যাশে-অনলি রিমোট সিস্টেম ব্যবহার করা বর্তমানে সম্ভব নয়, কারণ ক্যাশে মিস একটি ব্যর্থ ক্রিয়া হিসাবে বিবেচিত হবে।
দূরবর্তী কার্য সম্পাদনের জন্য সমস্ত ধরণের ক্রিয়াগুলি উপযুক্ত নয়৷ সর্বোত্তম প্রার্থী তারা যারা স্থানীয়ভাবে সহজাতভাবে দ্রুততর, উদাহরণস্বরূপ অবিরাম কর্মীদের ব্যবহারের মাধ্যমে, বা যারা যথেষ্ট দ্রুত দৌড়ায় যে দূরবর্তী কার্য সম্পাদনের ওভারহেড মৃত্যুদন্ডের সময়কে প্রাধান্য দেয়। যেহেতু প্রতিটি স্থানীয়ভাবে সম্পাদিত অ্যাকশন কিছু পরিমাণ CPU এবং মেমরি রিসোর্স লক করে, তাই চলমান অ্যাকশনগুলি যেগুলি এই বিভাগগুলির মধ্যে পড়ে না শুধুমাত্র তাদের জন্য নির্বাহকে বিলম্বিত করে।
রিলিজ 5.0.0-pre.20210708.4 অনুযায়ী , কর্মক্ষমতা প্রোফাইলিং -এ কর্মী নির্বাহ সম্পর্কে ডেটা থাকে, যার মধ্যে একটি গতিশীল এক্সিকিউশন রেস হারানোর পরে একটি কাজের অনুরোধ শেষ করার সময় ব্যয় করা হয়। আপনি যদি দেখেন যে ডায়নামিক এক্সিকিউশন ওয়ার্কার থ্রেডগুলি সম্পদ অর্জনের জন্য উল্লেখযোগ্য সময় ব্যয় করছে বা async-worker-finish
এ অনেক সময় ব্যয় করছে, তাহলে আপনার কিছু ধীর স্থানীয় ক্রিয়া কর্মী থ্রেডগুলিকে বিলম্বিত করতে পারে।
উপরের প্রোফাইলে, যা 8 জন জাভাক কর্মী ব্যবহার করে, আমরা দেখতে পাই যে অনেক জাভাক কর্মী রেস হারিয়েছে এবং অ্যাসিঙ্ক async-worker-finish
থ্রেডগুলিতে তাদের কাজ শেষ করছে। শ্রমিকদের বিলম্ব করার জন্য পর্যাপ্ত সম্পদ গ্রহণ করা একজন অ-শ্রমিক স্মৃতির কারণে এটি ঘটেছিল।
যখন শুধুমাত্র Javac-কে গতিশীল এক্সিকিউশন দিয়ে চালানো হয়, তখন শুরু হওয়া কর্মীদের প্রায় অর্ধেকই তাদের কাজ শুরু করার পর রেস হারায়।
পূর্বে প্রস্তাবিত --experimental_spawn_scheduler
ফ্ল্যাগটি বাতিল করা হয়েছে। এটি ডায়নামিক এক্সিকিউশন চালু করে এবং সমস্ত স্মৃতিবিদ্যার জন্য ডিফল্ট কৌশল হিসাবে dynamic
সেট করে, যা প্রায়শই এই ধরণের সমস্যার দিকে নিয়ে যায়।
সমস্যা সমাধান
ডায়নামিক এক্সিকিউশনের সমস্যাগুলি সূক্ষ্ম এবং ডিবাগ করা কঠিন হতে পারে, কারণ সেগুলি শুধুমাত্র স্থানীয় এবং দূরবর্তী এক্সিকিউশনের কিছু নির্দিষ্ট সমন্বয়ের অধীনে প্রকাশ করতে পারে। --debug_spawn_scheduler
ডায়নামিক এক্সিকিউশন সিস্টেম থেকে অতিরিক্ত আউটপুট যোগ করে যা এই সমস্যাগুলি ডিবাগ করতে সাহায্য করতে পারে। সমস্যাগুলি পুনরুত্পাদন করা সহজ করতে আপনি --local_execution_delay
পতাকা এবং দূরবর্তী বনাম স্থানীয় কাজের সংখ্যা সামঞ্জস্য করতে পারেন।
আপনি যদি standalone
কৌশল ব্যবহার করে গতিশীল সম্পাদনে সমস্যার সম্মুখীন হন, তবে --experimental_local_lockfree_output
ছাড়া চালানোর চেষ্টা করুন, অথবা আপনার স্থানীয় ক্রিয়াগুলি স্যান্ডবক্সে চালান৷ এটি আপনার বিল্ডকে কিছুটা ধীর করে দিতে পারে (আপনি যদি ম্যাক বা উইন্ডোজে থাকেন তবে উপরে দেখুন), তবে ব্যর্থতার কিছু সম্ভাব্য কারণ সরিয়ে দেয়।