অবিরাম শ্রমিক

এই পৃষ্ঠাটি কভার করে যে কীভাবে অবিরাম কর্মীদের ব্যবহার করতে হয়, সুবিধা, প্রয়োজনীয়তা এবং কীভাবে কর্মীরা স্যান্ডবক্সিংকে প্রভাবিত করে।

একটি অবিরাম কর্মী হল ব্যাজেল সার্ভার দ্বারা শুরু হওয়া একটি দীর্ঘ-চলমান প্রক্রিয়া, যা প্রকৃত টুল (সাধারণত একটি কম্পাইলার) এর চারপাশে একটি মোড়ক হিসাবে কাজ করে বা নিজেই টুল । ক্রমাগত কর্মীদের থেকে উপকৃত হওয়ার জন্য, টুলটিকে অবশ্যই সংকলনের একটি ক্রম করতে সমর্থন করতে হবে এবং র্যাপারকে টুলের API এবং নীচে বর্ণিত অনুরোধ/প্রতিক্রিয়া বিন্যাসের মধ্যে অনুবাদ করতে হবে। একই --persistent_worker পতাকা সহ এবং ছাড়া একই কর্মীকে ডাকা হতে পারে, এবং উপযুক্তভাবে টুলের সাথে কথা বলা এবং প্রস্থান করার সময় কর্মীদের বন্ধ করার জন্য দায়ী। প্রতিটি কর্মী দৃষ্টান্ত <outputBase>/bazel-workers অধীনে একটি পৃথক ওয়ার্কিং ডিরেক্টরি বরাদ্দ করা হয় (কিন্তু এতে ক্রোট করা হয় না)।

অবিরাম কর্মীদের ব্যবহার করা একটি কার্যকরী কৌশল যা স্টার্ট-আপ ওভারহেড হ্রাস করে, আরও JIT সংকলনের অনুমতি দেয় এবং অ্যাকশন এক্সিকিউশনে অ্যাবস্ট্রাক্ট সিনট্যাক্স ট্রির ক্যাশিং সক্ষম করে। এই কৌশলটি দীর্ঘ-চলমান প্রক্রিয়ায় একাধিক অনুরোধ পাঠানোর মাধ্যমে এই উন্নতিগুলি অর্জন করে।

জাভা, স্কালা , কোটলিন এবং আরও অনেক কিছু সহ একাধিক ভাষার জন্য অবিরাম কর্মী প্রয়োগ করা হয়।

একটি NodeJS রানটাইম ব্যবহার করে প্রোগ্রাম কর্মী প্রোটোকল বাস্তবায়ন করতে @bazel/worker হেল্পার লাইব্রেরি ব্যবহার করতে পারে।

অবিরাম কর্মীদের ব্যবহার করে

Bazel 0.27 এবং উচ্চতর বিল্ডগুলি কার্যকর করার সময় ডিফল্টরূপে স্থায়ী কর্মীদের ব্যবহার করে, যদিও দূরবর্তী সম্পাদন অগ্রাধিকার নেয়। ক্রমাগত কর্মীদের সমর্থন করে না এমন ক্রিয়াগুলির জন্য, Bazel প্রতিটি কর্মের জন্য একটি টুল ইন্সট্যান্স শুরু করতে ফিরে আসে। আপনি প্রযোজ্য টুল স্মৃতিবিদ্যার জন্য worker কৌশল সেট করে অবিরাম কর্মীদের ব্যবহার করার জন্য স্পষ্টভাবে আপনার বিল্ড সেট করতে পারেন। একটি সর্বোত্তম অনুশীলন হিসাবে, এই উদাহরণে worker কৌশলের ফলব্যাক হিসাবে local নির্দিষ্ট করা অন্তর্ভুক্ত রয়েছে:

bazel build //my:target --strategy=Javac=worker,local

স্থানীয় কৌশলের পরিবর্তে কর্মীদের কৌশল ব্যবহার করা বাস্তবায়নের উপর নির্ভর করে সংকলনের গতি উল্লেখযোগ্যভাবে বৃদ্ধি করতে পারে। জাভার জন্য, বিল্ডগুলি 2-4 গুণ দ্রুত হতে পারে, কখনও কখনও ক্রমবর্ধমান সংকলনের জন্য আরও বেশি। কম্পাইলিং Bazel কর্মীদের সাথে প্রায় 2.5 গুণ দ্রুত। আরও বিশদ বিবরণের জন্য, " কর্মীদের সংখ্যা নির্বাচন করা " বিভাগটি দেখুন।

যদি আপনার কাছে একটি দূরবর্তী বিল্ড এনভায়রনমেন্ট থাকে যা আপনার স্থানীয় বিল্ড এনভায়রনমেন্টের সাথে মেলে, আপনি পরীক্ষামূলক ডাইনামিক কৌশলটি ব্যবহার করতে পারেন, যা একটি দূরবর্তী এক্সিকিউশন এবং কর্মী এক্সিকিউশনকে রেস করে। গতিশীল কৌশল সক্ষম করতে, --experimental_spawn_scheduler পতাকা পাস করুন। এই কৌশলটি স্বয়ংক্রিয়ভাবে কর্মীদের সক্ষম করে, তাই worker কৌশল নির্দিষ্ট করার কোন প্রয়োজন নেই, তবে আপনি এখনও local বা sandboxed করা ফলব্যাক হিসাবে ব্যবহার করতে পারেন।

কর্মী সংখ্যা নির্বাচন

মেমোনিক প্রতি কর্মী দৃষ্টান্তের ডিফল্ট সংখ্যা 4, কিন্তু worker_max_instances পতাকা দিয়ে সামঞ্জস্য করা যেতে পারে। উপলব্ধ সিপিইউগুলির ভাল ব্যবহার এবং জেআইটি সংকলন এবং ক্যাশে হিটগুলির পরিমাণের মধ্যে একটি বাণিজ্য বন্ধ রয়েছে৷ আরও কর্মীদের সাথে, আরও লক্ষ্যগুলি নন-জেআইটিটেড কোড চালানো এবং কোল্ড ক্যাশে আঘাত করার স্টার্ট-আপ খরচ প্রদান করবে। আপনার যদি অল্প সংখ্যক লক্ষ্যমাত্রা তৈরি করা থাকে, তাহলে একজন একক কর্মী সংকলন গতি এবং সংস্থান ব্যবহারের মধ্যে সর্বোত্তম ট্রেড-অফ দিতে পারে (উদাহরণস্বরূপ, সংখ্যা #8586 দেখুন। worker_max_instances ফ্ল্যাগ প্রতি স্মারক এবং ফ্ল্যাগ প্রতি কর্মী দৃষ্টান্তের সর্বাধিক সংখ্যা নির্ধারণ করে। সেট (নীচে দেখুন), তাই একটি মিশ্র সিস্টেমে আপনি যদি ডিফল্ট মান রাখেন তবে আপনি অনেক মেমরি ব্যবহার করতে পারেন। ক্রমবর্ধমান বিল্ডের জন্য একাধিক কর্মী উদাহরণের সুবিধা আরও ছোট।

এই গ্রাফটি 64 গিগাবাইট RAM সহ একটি 6-কোর হাইপার-থ্রেডেড Intel Xeon 3.5 GHz Linux ওয়ার্কস্টেশনে Bazel (target //src:bazel ) এর থেকে স্ক্র্যাচ সংকলনের সময় দেখায়। প্রতিটি কর্মী কনফিগারেশনের জন্য, পাঁচটি পরিষ্কার বিল্ড চালানো হয় এবং শেষ চারটির গড় নেওয়া হয়।

Graph of performance improvements of clean builds

চিত্র 1. পরিচ্ছন্ন বিল্ডের কর্মক্ষমতা উন্নতির গ্রাফ।

এই কনফিগারেশনের জন্য, দুইজন কর্মী দ্রুততম কম্পাইল দেয়, যদিও একজন কর্মীর তুলনায় মাত্র 14% উন্নতি। আপনি যদি কম মেমরি ব্যবহার করতে চান তবে একজন কর্মী একটি ভাল বিকল্প।

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

AbstractContainerizingSandboxedSpawn.java এ একটি অভ্যন্তরীণ স্ট্রিং ধ্রুবক পরিবর্তন করার পরে শুধুমাত্র জাভা উত্সগুলি পুনরায় কম্পাইল করা ( //src/main/java/com/google/devtools/build/lib/bazel:BazelServer_deploy.jar ) একটি 3x গতি-আপ দেয় (20 এর গড় একটি ওয়ার্মআপ বিল্ডের সাথে বর্ধিত বিল্ডগুলি বাতিল করা হয়েছে):

Graph of performance improvements of incremental builds

চিত্র 2. ক্রমবর্ধমান বিল্ডগুলির কর্মক্ষমতা উন্নতির গ্রাফ।

গতি বৃদ্ধি করা পরিবর্তনের উপর নির্ভর করে। একটি ফ্যাক্টর 6 এর গতি-আপ উপরের পরিস্থিতিতে পরিমাপ করা হয় যখন একটি সাধারণভাবে ব্যবহৃত ধ্রুবক পরিবর্তন করা হয়।

অবিরাম কর্মীদের পরিবর্তন করা

আপনি কর্মীদের জন্য স্টার্ট-আপ পতাকা নির্দিষ্ট করতে --worker_extra_flag পতাকাটি পাস করতে পারেন, যা মেমোনিক দ্বারা চাবি করা হয়। উদাহরণস্বরূপ, --worker_extra_flag=javac=--debug পাস করা শুধুমাত্র Javac-এর জন্য ডিবাগিং চালু করে। এই পতাকার ব্যবহার প্রতি শুধুমাত্র একটি কর্মী পতাকা সেট করা যেতে পারে, এবং শুধুমাত্র একটি স্মৃতির জন্য। শ্রমিকদের শুধুমাত্র প্রতিটি স্মৃতিবিজড়িত ব্যক্তির জন্য আলাদাভাবে তৈরি করা হয় না, তবে তাদের স্টার্ট-আপ পতাকার বিভিন্নতার জন্যও। মেমোনিক এবং স্টার্ট-আপ পতাকার প্রতিটি সংমিশ্রণ একটি WorkerKey মিলিত হয় এবং প্রতিটি WorkerKey জন্য worker_max_instances পর্যন্ত কর্মী তৈরি করা যেতে পারে। অ্যাকশন কনফিগারেশন কীভাবে সেট-আপ ফ্ল্যাগগুলি নির্দিষ্ট করতে পারে তার জন্য পরবর্তী বিভাগটি দেখুন।

আপনি একটি স্মারক নির্দিষ্ট করতে --high_priority_workers পতাকা ব্যবহার করতে পারেন যা স্বাভাবিক-অগ্রাধিকার মেমোনিক্সের অগ্রাধিকারে চালানো উচিত। এটি সর্বদা সমালোচনামূলক পথে থাকা ক্রিয়াগুলিকে অগ্রাধিকার দিতে সহায়তা করতে পারে। যদি দুই বা ততোধিক উচ্চ অগ্রাধিকার কর্মী অনুরোধ সম্পাদন করে, অন্য সমস্ত কর্মীকে দৌড়াতে বাধা দেওয়া হয়। এই পতাকা একাধিকবার ব্যবহার করা যেতে পারে।

--worker_sandboxing পতাকা পাস করার ফলে প্রতিটি কর্মীর অনুরোধ তার সমস্ত ইনপুটের জন্য একটি পৃথক স্যান্ডবক্স ডিরেক্টরি ব্যবহার করে। স্যান্ডবক্স সেট আপ করতে কিছু অতিরিক্ত সময় লাগে, বিশেষ করে macOS-এ, তবে আরও ভাল সঠিকতার গ্যারান্টি দেয়।

--worker_quit_after_build পতাকাটি মূলত ডিবাগিং এবং প্রোফাইলিংয়ের জন্য উপযোগী। এই পতাকা একটি নির্মাণ সম্পন্ন হলে সমস্ত শ্রমিকদের ছেড়ে যেতে বাধ্য করে। শ্রমিকরা কী করছে সে সম্পর্কে আরও আউটপুট পেতে আপনি --worker_verbose পাস করতে পারেন। এই পতাকাটি WorkRequestverbosity ফিল্ডে প্রতিফলিত হয়, যা কর্মী বাস্তবায়নকে আরও ভারবোস হতে দেয়।

শ্রমিকরা তাদের লগগুলি <outputBase>/bazel-workers ডিরেক্টরিতে সংরক্ষণ করে, উদাহরণস্বরূপ /tmp/_bazel_larsrc/191013354bebe14fdddae77f2679c3ef/bazel-workers/worker-1-Javac.log । ফাইলের নামটিতে কর্মী আইডি এবং মেমোনিক অন্তর্ভুক্ত রয়েছে। যেহেতু স্মারক প্রতি একাধিক WorkerKey থাকতে পারে, তাই আপনি একটি প্রদত্ত স্মৃতির জন্য worker_max_instances লগ ফাইল দেখতে পারেন।

অ্যান্ড্রয়েড বিল্ডের জন্য, অ্যান্ড্রয়েড বিল্ড পারফরম্যান্স পৃষ্ঠায় বিশদ দেখুন।

অবিরাম কর্মীদের বাস্তবায়ন

কিভাবে একজন কর্মী তৈরি করতে হয় সে সম্পর্কে আরও তথ্যের জন্য ক্রমাগত কর্মী তৈরির পৃষ্ঠাটি দেখুন।

এই উদাহরণটি JSON ব্যবহার করে এমন একজন কর্মীর জন্য একটি স্টারলার্ক কনফিগারেশন দেখায়:

args_file = ctx.actions.declare_file(ctx.label.name + "_args_file")
ctx.actions.write(
    output = args_file,
    content = "\n".join(["-g", "-source", "1.5"] + ctx.files.srcs),
)
ctx.actions.run(
    mnemonic = "SomeCompiler",
    executable = "bin/some_compiler_wrapper",
    inputs = inputs,
    outputs = outputs,
    arguments = [ "-max_mem=4G",  "@%s" % args_file.path],
    execution_requirements = {
        "supports-workers" : "1", "requires-worker-protocol" : "json" }
)

এই সংজ্ঞার সাথে, এই কর্মের প্রথম ব্যবহার কমান্ড লাইন /bin/some_compiler -max_mem=4G --persistent_worker চালানোর মাধ্যমে শুরু হবে। Foo.java কম্পাইল করার জন্য একটি অনুরোধ তখন এরকম দেখাবে:

দ্রষ্টব্য: যদিও প্রোটোকল বাফার স্পেসিফিকেশন "স্নেক কেস" ( request_id ) ব্যবহার করে, JSON প্রোটোকল "উট কেস" ( requestId ) ব্যবহার করে। এই নথিতে, আমরা JSON উদাহরণগুলিতে উটের কেস ব্যবহার করব, তবে প্রোটোকল নির্বিশেষে ক্ষেত্রের বিষয়ে কথা বলার সময় সাপের ক্ষেত্রে।

{
  "arguments": [ "-g", "-source", "1.5", "Foo.java" ]
  "inputs": [
    { "path": "symlinkfarm/input1", "digest": "d49a..." },
    { "path": "symlinkfarm/input2", "digest": "093d..." },
  ],
}

কর্মী নতুন লাইন-ডিলিমিটেড JSON ফর্ম্যাটে stdin এ এটি পায় (কারণ requires-worker-protocol JSON-এ সেট করা আছে)। কর্মী তারপরে ক্রিয়াটি সম্পাদন করে এবং তার stdout এ Bazel-এ একটি JSON- ফরম্যাট করা WorkResponse পাঠায়। Bazel তারপর এই প্রতিক্রিয়া বিশ্লেষণ করে এবং ম্যানুয়ালি এটিকে একটি WorkResponse রূপান্তর করে। JSON-এর পরিবর্তে বাইনারি-এনকোডেড প্রোটোবাফ ব্যবহার করে সংশ্লিষ্ট কর্মীর সাথে যোগাযোগ করতে, requires-worker-protocol proto সেট করা হবে, যেমন:

  execution_requirements = {
    "supports-workers" : "1" ,
    "requires-worker-protocol" : "proto"
  }

আপনি যদি এক্সিকিউশনের প্রয়োজনীয়তার মধ্যে requires-worker-protocol অন্তর্ভুক্ত না করেন, Bazel প্রোটোবাফ ব্যবহার করার জন্য কর্মী যোগাযোগ ডিফল্ট করবে।

ব্যাজেল মেমোনিক এবং শেয়ার্ড ফ্ল্যাগ থেকে WorkerKey প্রাপ্ত করে, তাই যদি এই কনফিগারেশনটি max_mem প্যারামিটার পরিবর্তন করার অনুমতি দেয়, তাহলে ব্যবহৃত প্রতিটি মানের জন্য একটি পৃথক কর্মী তৈরি করা হবে। এটি অত্যধিক মেমরি খরচ হতে পারে যদি অনেক বৈচিত্র ব্যবহার করা হয়।

প্রতিটি কর্মী বর্তমানে একটি সময়ে শুধুমাত্র একটি অনুরোধ প্রক্রিয়া করতে পারেন। পরীক্ষামূলক মাল্টিপ্লেক্স কর্মীদের বৈশিষ্ট্য একাধিক থ্রেড ব্যবহার করার অনুমতি দেয়, যদি অন্তর্নিহিত টুলটি মাল্টিথ্রেড করা হয় এবং এটি বোঝার জন্য র্যাপার সেট আপ করা হয়।

এই গিটহাব রেপোতে , আপনি জাভা এবং পাইথনে লেখা উদাহরণ ওয়ার্কার র্যাপার দেখতে পারেন। আপনি যদি জাভাস্ক্রিপ্ট বা টাইপস্ক্রিপ্টে কাজ করেন, তাহলে @bazel/worker প্যাকেজ এবং nodejs worker উদাহরণ সহায়ক হতে পারে।

কর্মীরা কিভাবে স্যান্ডবক্সিংকে প্রভাবিত করে?

ডিফল্টরূপে worker কৌশল ব্যবহার করা local কৌশলের মতো স্যান্ডবক্সে অ্যাকশন চালায় না। আপনি স্যান্ডবক্সের ভিতরে সমস্ত কর্মীদের চালানোর জন্য --worker_sandboxing পতাকা সেট করতে পারেন, এটি নিশ্চিত করে যে টুলটির প্রতিটি এক্সিকিউশন শুধুমাত্র সেই ইনপুট ফাইলগুলি দেখতে পাবে যা এটি থাকার কথা। টুলটি এখনও অভ্যন্তরীণভাবে অনুরোধের মধ্যে তথ্য ফাঁস করতে পারে, উদাহরণস্বরূপ একটি ক্যাশের মাধ্যমে। dynamic কৌশল ব্যবহার করার জন্য কর্মীদের স্যান্ডবক্স করা প্রয়োজন

কর্মীদের সাথে কম্পাইলার ক্যাশে সঠিক ব্যবহারের অনুমতি দিতে, প্রতিটি ইনপুট ফাইলের সাথে একটি ডাইজেস্ট পাস করা হয়। এইভাবে কম্পাইলার বা র‍্যাপার ফাইলটি পড়া ছাড়াই ইনপুটটি বৈধ কিনা তা পরীক্ষা করতে পারে।

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

মাল্টিপ্লেক্স কর্মীদের শুধুমাত্র স্যান্ডবক্স করা যেতে পারে যদি কর্মী বাস্তবায়ন এটিকে সমর্থন করে, এবং এই স্যান্ডবক্সিংটিকে অবশ্যই --experimental_worker_multiplex_sandboxing পতাকা দিয়ে আলাদাভাবে সক্ষম করতে হবে। ডিজাইন ডকে আরও বিশদ দেখুন)।

আরও পড়া

অবিরাম কর্মীদের সম্পর্কে আরও তথ্যের জন্য, দেখুন: