Cgroup বিমূর্ততা স্তর

অ্যান্ড্রয়েড 10 এবং উচ্চতর টাস্ক প্রোফাইলের সাথে একটি কন্ট্রোল গ্রুপ (সিগ্রুপ) অ্যাবস্ট্রাকশন লেয়ার ব্যবহার করে, যা ডেভেলপাররা থ্রেড বা প্রক্রিয়াতে প্রয়োগ করার জন্য সীমাবদ্ধতার একটি সেট (বা সেট) বর্ণনা করতে ব্যবহার করতে পারে। সিস্টেম তারপর এক বা একাধিক উপযুক্ত cgroups নির্বাচন করার জন্য টাস্ক প্রোফাইলের নির্ধারিত ক্রিয়াগুলি অনুসরণ করে, যার মাধ্যমে বিধিনিষেধ প্রয়োগ করা হয়, এবং উচ্চতর সফ্টওয়্যার স্তরগুলিকে প্রভাবিত না করে অন্তর্নিহিত cgroup বৈশিষ্ট্য সেটে পরিবর্তন করা যেতে পারে।

cgroups সম্পর্কে

Cgroups বিশেষ আচরণ সহ অনুক্রমিক গোষ্ঠীতে কর্মের সেটগুলি (যাতে প্রসেস, থ্রেড এবং তাদের সমস্ত ভবিষ্যত সন্তান রয়েছে) একত্রিত এবং বিভাজন করার জন্য একটি প্রক্রিয়া প্রদান করে। অ্যান্ড্রয়েড লিনাক্স কার্নেল cgroups v1 এবং cgroups v2 এর সমর্থন সহ সিস্টেম রিসোর্স যেমন CPU এবং মেমরি ব্যবহার এবং বরাদ্দকরণের জন্য নিয়ন্ত্রণ এবং অ্যাকাউন্টের জন্য cgroups ব্যবহার করে।

অ্যান্ড্রয়েড 9 এবং তার নিচের

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

Android 10 এবং উচ্চতর

অ্যান্ড্রয়েড 10 এবং উচ্চতর টাস্ক প্রোফাইলের সাথে সিগ্রুপ ব্যবহার করে:

  • সিগ্রুপ সেটআপ। ডেভেলপাররা তাদের cgroups.json ফাইলে cgroups সেটআপ বর্ণনা করে cgroups এর সেট, এবং তাদের মাউন্ট করার অবস্থান এবং বৈশিষ্ট্য নির্ধারণ করতে। প্রারম্ভিক প্রক্রিয়ার প্রাথমিক-ইনিট পর্যায়ে সমস্ত cgroups মাউন্ট করা হয়।
  • টাস্ক প্রোফাইল। এগুলি একটি বিমূর্ততা প্রদান করে যা এর বাস্তবায়নের বিশদ থেকে প্রয়োজনীয় কার্যকারিতাকে দ্বিগুণ করে। Android ফ্রেমওয়ার্ক SetTaskProfiles এবং SetProcessProfiles API ব্যবহার করে একটি প্রক্রিয়া বা থ্রেডে task_profiles.json ফাইলে বর্ণিত টাস্ক প্রোফাইলগুলিকে প্রয়োগ করে৷ (এই APIগুলি Android 11 এবং উচ্চতর সংস্করণের জন্য অনন্য।)

পশ্চাদগামী সামঞ্জস্য প্রদানের জন্য, লিগ্যাসি ফাংশন set_cpuset_policy , set_sched_policy , এবং get_sched_policy একই API এবং কার্যকারিতা প্রদান করে, কিন্তু তাদের বাস্তবায়ন টাস্ক প্রোফাইল ব্যবহার করার জন্য পরিবর্তন করা হয়েছে। নতুন ব্যবহারের ক্ষেত্রে AOSP লিগ্যাসি set_sched_policy ফাংশনের পরিবর্তে নতুন টাস্ক প্রোফাইল API ব্যবহার করার পরামর্শ দেয়।

Cgroups বিবরণ ফাইল

Cgroups <ANDROID_BUILD_TOP>/system/core/libprocessgroup/profiles/ এর অধীনে অবস্থিত cgroups.json ফাইলে বর্ণনা করা হয়েছে। প্রতিটি কন্ট্রোলারকে একটি উপধারায় বর্ণনা করা হয়েছে এবং ন্যূনতম নিম্নলিখিতগুলি থাকতে হবে:

  • নাম, কন্ট্রোলার ক্ষেত্র দ্বারা সংজ্ঞায়িত।
  • মাউন্টিং পাথ, পাথ ক্ষেত্র দ্বারা সংজ্ঞায়িত।
  • মোড , UID (ব্যবহারকারী আইডি), এবং GID (গ্রুপ আইডি) এই পথের অধীনে ফাইলগুলির জন্য মালিক এবং অ্যাক্সেস মোড বর্ণনা করে (সমস্ত ঐচ্ছিক)।
  • ঐচ্ছিক বৈশিষ্ট্য, একটি cgroup কন্ট্রোলার দ্বারা সৃষ্ট মাউন্টিং ত্রুটি যা কার্নেল মাউন্ট করা সমর্থন করে না সিস্টেমটিকে উপেক্ষা করার জন্য সত্যে সেট করা হয়েছে।

উদাহরণ cgroups.json ফাইল

নীচের উদাহরণটি তাদের নিজ নিজ পাথ সহ cgroup v1 ( Cgroups ) এবং cgroup v2 ( Cgroups2 ) কন্ট্রোলারের বিবরণ দেখায়।

{
  "Cgroups": [
    {
      "Controller": "cpu",
      "Path": "/dev/cpuctl",
      "Mode": "0755",
      "UID": "system",
      "GID": "system"
    },
    {
      "Controller": "memory",
      "Path": "/dev/memcg",
      "Mode": "0700",
      "Optional": true
    }
  ],
 "Cgroups2": {
   "Path": "/sys/fs/cgroup",
   "Mode": "0755",
   "UID": "system",
   "GID": "system",
   "Controllers": [
     {
       "Controller": "freezer",
       "Path": ".",
       "Mode": "0755",
       "UID": "system",
       "GID": "system"
     }
   ]
 }
}

এই উদাহরণ ফাইলটিতে দুটি বিভাগ রয়েছে, Cgroups (cgroups v1 কন্ট্রোলারের বর্ণনা) এবং Cgroups2 (cgroup v2 কন্ট্রোলারের বর্ণনা)। cgroups v2 অনুক্রমের সমস্ত কন্ট্রোলার একই অবস্থানে মাউন্ট করা হয়। তাই, Cgroups2 বিভাগের নিজস্ব পাথ , মোড , UID , এবং GID বৈশিষ্ট্য রয়েছে যা স্থান এবং শ্রেণিবিন্যাসের মূলের জন্য বৈশিষ্ট্য বর্ণনা করতে পারে। Cgroups2-এর অধীনে কন্ট্রোলারের জন্য পাথ অ্যাট্রিবিউট সেই রুট পাথের সাথে আপেক্ষিক। অ্যান্ড্রয়েড 12 এবং উচ্চতর তে আপনি একটি cgroup কন্ট্রোলারকে সংজ্ঞায়িত করতে পারেন যা পাথ এবং মোড দিয়ে নির্দিষ্ট করা হয়েছে "Optional" হিসাবে এটিকে true সেট করে৷

cgroups.json ফাইলটিকে init প্রক্রিয়ার অংশ হিসেবে পার্স করা হয়, প্রারম্ভিক-init পর্যায়ে, এবং cgroups নির্দিষ্ট স্থানে মাউন্ট করা হয়। পরে cgroup মাউন্ট অবস্থানগুলি পেতে, CgroupGetControllerPath API ফাংশন ব্যবহার করুন।

টাস্ক প্রোফাইল ফাইল

task_profiles.json ফাইলটি <ANDROID_BUILD_TOP>/system/core/libprocessgroup/profiles/ এর অধীনে অবস্থিত। একটি প্রক্রিয়া বা একটি থ্রেডে প্রয়োগ করা কর্মের একটি নির্দিষ্ট সেট বর্ণনা করতে এটি ব্যবহার করুন। ক্রিয়াগুলির একটি সেট একটি প্রোফাইল নামের সাথে যুক্ত, যা SetTaskProfiles এবং SetProcessProfiles কলগুলিতে প্রোফাইল ক্রিয়াগুলি শুরু করতে ব্যবহৃত হয়৷

উদাহরণ task_profiles.json ফাইল

{
  "Attributes": [
    {
      "Name": "MemSoftLimit",
      "Controller": "memory",
      "File": "memory.soft_limit_in_bytes"
    },
    {
      "Name": "MemSwappiness",
      "Controller": "memory",
      "File": "memory.swappiness"
    }
  ],
  "Profiles": [
    {
      "Name": "MaxPerformance",
      "Actions" : [
        {
          "Name" : "JoinCgroup",
          "Params" :
          {
            "Controller": "schedtune",
            "Path": "top-app"
          }
        }
      ]
    },
    {
      "Name": "TimerSlackHigh",
      "Actions" : [
        {
          "Name" : "SetTimerSlack",
          "Params" :
          {
            "Slack": "40000000"
          }
        }
      ]
    },
    {
      "Name": "LowMemoryUsage",
      "Actions" : [
        {
          "Name" : "SetAttribute",
          "Params" :
          {
            "Name" : "MemSoftLimit",
            "Value" : "16MB"
          }
        },
        {
          "Name" : "SetAttribute",
          "Params" :
          {
            "Name" : "MemSwappiness",
            "Value" : "150"

          }
        }
      ]
    }
  ]
  "AggregateProfiles": [
     {
       "Name": "SCHED_SP_DEFAULT",
       "Profiles": [ "TimerSlackHigh", "MaxPerformance" ]
     },
     {
       "Name": "SCHED_SP_BACKGROUND",
       "Profiles": [ "LowMemoryUsage" ]
     }
}

আপনার বৈশিষ্ট্য তালিকার এন্ট্রি হিসাবে নির্দিষ্ট cgroup ফাইলে নাম বরাদ্দ করুন। প্রতিটি এন্ট্রি নিম্নলিখিত রয়েছে:

  • নাম ক্ষেত্রটি বৈশিষ্ট্যের নাম নির্দিষ্ট করে।
  • কন্ট্রোলার ফিল্ড cgroups.json ফাইল থেকে একটি cgroup কন্ট্রোলারকে এর নাম দিয়ে উল্লেখ করে।
  • ফাইল ফিল্ড এই কন্ট্রোলারের অধীনে একটি নির্দিষ্ট ফাইলের নাম দেয়।

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

প্রোফাইল বিভাগে নিম্নলিখিত সহ টাস্ক প্রোফাইল সংজ্ঞা রয়েছে:

  • নাম ক্ষেত্র প্রোফাইল নাম সংজ্ঞায়িত করে।
  • অ্যাকশন বিভাগ প্রোফাইলটি প্রয়োগ করার সময় সম্পাদিত ক্রিয়াগুলির একটি সেট তালিকাভুক্ত করে। প্রতিটি কর্মের নিম্নলিখিত আছে:

    • নাম ক্ষেত্র কর্ম নির্দিষ্ট করে।
    • প্যারামস বিভাগটি কর্মের জন্য পরামিতিগুলির একটি সেট নির্দিষ্ট করে।

সমর্থিত ক্রিয়াগুলি টেবিলে তালিকাভুক্ত করা হয়েছে:

অ্যাকশন প্যারামিটার বর্ণনা
SetTimerSlack Slack এনএসে টাইমার স্ল্যাক
SetAttribute Name অ্যাট্রিবিউট বিভাগ থেকে একটি অ্যাট্রিবিউট উল্লেখ করে এমন একটি নাম
Value নামযুক্ত বৈশিষ্ট্য দ্বারা উপস্থাপিত ফাইলে একটি মান লিখতে হবে
WriteFile FilePath ফাইলের পাথ
Value ফাইলে একটি মান লিখতে হবে
JoinCgroup Controller cgroups.json থেকে cgroup কন্ট্রোলারের একটি নাম
Path cgroup কন্ট্রোলারের অনুক্রমের একটি সাব-গ্রুপ পাথ

অ্যান্ড্রয়েড 12 এবং উচ্চতর বৈশিষ্ট্য একটি AggregateProfiles বিভাগ যাতে সমষ্টিগত প্রোফাইল রয়েছে, যার প্রতিটি এক বা একাধিক প্রোফাইলের সেটের জন্য একটি উপনাম। সামগ্রিক প্রোফাইল সংজ্ঞা নিম্নলিখিতগুলি নিয়ে গঠিত:

  • নাম ক্ষেত্র সমষ্টি প্রোফাইলের নাম নির্দিষ্ট করে।
  • প্রোফাইল ক্ষেত্র সমষ্টি প্রোফাইলে অন্তর্ভুক্ত প্রোফাইলের নাম তালিকাভুক্ত করে।

যখন একটি সমষ্টিগত প্রোফাইল প্রয়োগ করা হয়, সমস্ত ধারণকারী প্রোফাইলগুলি স্বয়ংক্রিয়ভাবে প্রয়োগ করা হয়। সমষ্টিগত প্রোফাইলে পৃথক প্রোফাইল বা অন্যান্য সমষ্টিগত প্রোফাইল উভয়ই থাকতে পারে, যতক্ষণ না কোনও পুনরাবৃত্তি না থাকে (একটি প্রোফাইল যা নিজেকে অন্তর্ভুক্ত করে)।

task_profiles init ভাষা কমান্ড

একটি নির্দিষ্ট প্রক্রিয়ার জন্য টাস্ক প্রোফাইল সক্রিয়করণের সুবিধার্থে Android 12 এবং উচ্চতর সংস্করণের জন্য Android Init ল্যাঙ্গুয়েজে একটি task_profiles কমান্ড উপলব্ধ। এটি writepid কমান্ডকে প্রতিস্থাপন করে (অ্যান্ড্রয়েড 12-এ অবমুক্ত) যা cgroups-এর মধ্যে একটি প্রক্রিয়া স্থানান্তর করতে ব্যবহৃত হয়েছিল। task_profiles কমান্ড উপরের স্তরগুলিতে কোন প্রভাব ছাড়াই অন্তর্নিহিত বাস্তবায়ন পরিবর্তন করার জন্য নমনীয়তা প্রদান করে। নীচের উদাহরণে, এই দুটি কমান্ড কার্যকরভাবে একই অপারেশন সম্পাদন করে:

  • writepid /dev/cpuctl/top-app/tasks

    অ্যান্ড্রয়েড 12-এ অপ্রচলিত, এটি বর্তমান টাস্কের পিআইডি /dev/cpuctl/top-app/tasks ফাইলে লিখতে ব্যবহার করা হয়েছিল।

  • task_profiles MaxPerformance

    বর্তমান প্রক্রিয়ায় "cpu" কন্ট্রোলার ( cpuctl ) এর অধীনে টপ-অ্যাপ গ্রুপে যোগদান করে, যার ফলে প্রক্রিয়াটির PID dev/cpuctl/top-app/tasks এ লেখা হয়।

অ্যান্ড্রয়েড 12 এবং উচ্চতর সিগ্রুপ হায়ারার্কিতে কাজগুলি স্থানান্তর করতে সর্বদা task_profiles কমান্ডটি ব্যবহার করুন। এটি task_profiles.json ফাইলে নির্দিষ্ট করা প্রোফাইলের নাম উপস্থাপন করে এক বা একাধিক প্যারামিটার গ্রহণ করে।

প্রতি API-স্তরের টাস্ক প্রোফাইল

অ্যান্ড্রয়েড 12 এবং উচ্চতর সংস্করণে, আপনি ডিফল্ট cgroups.json এবং task_profiles.json ফাইলগুলিতে সংজ্ঞা সংশোধন বা ওভাররাইড করতে পারেন, হয় Android API স্তরে আপনার পরিবর্তনের ভিত্তি করে, অথবা এটি বিক্রেতা পার্টিশন থেকে তৈরি করতে পারেন।

API স্তরের উপর ভিত্তি করে সংজ্ঞাগুলিকে ওভাররাইড করতে, নিম্নলিখিত ফাইলগুলি ডিভাইসে উপস্থিত থাকতে হবে:

  • /system/etc/task_profiles/cgroups_<API level>.json

    একটি API স্তরের জন্য নির্দিষ্ট cgroups এর জন্য এটি ব্যবহার করুন।

  • /system/etc/task_profiles/task_profiles_<API level>.json

    একটি API স্তরের নির্দিষ্ট প্রোফাইলের জন্য এটি ব্যবহার করুন।

বিক্রেতা পার্টিশন থেকে সংজ্ঞা ওভাররাইড করতে, নিম্নলিখিত ফাইলগুলি ডিভাইসে উপস্থিত থাকতে হবে:

  • /vendor/etc/cgroups.json
  • /vendor/etc/task_profiles.json

যদি এই ফাইলগুলিতে একটি বৈশিষ্ট্য বা একটি প্রোফাইল সংজ্ঞা ডিফল্ট ফাইলের মতো একই নাম ব্যবহার করে, ফাইল (API-স্তর বা বিক্রেতা-স্তরের) সংজ্ঞাটি পূর্ববর্তী সংজ্ঞাটিকে ওভাররাইড করে। এছাড়াও নোট করুন যে বিক্রেতা-স্তরের সংজ্ঞাগুলি API-স্তরের সংজ্ঞাগুলিকে ওভাররাইড করে। যদি নতুন সংজ্ঞাটির একটি নতুন নাম থাকে, তাহলে বৈশিষ্ট্য বা প্রোফাইলের সেটটি নতুন সংজ্ঞা দিয়ে সংশোধন করা হয়।

অ্যান্ড্রয়েড সিস্টেম এই ক্রমে cgroup এবং task_profile ফাইলগুলি লোড করে:

  1. ডিফল্ট cgroups.json এবং task_profiles.json ফাইল।
  2. API স্তর-নির্দিষ্ট ফাইল, যদি উপস্থিত থাকে।
  3. বিক্রেতা পার্টিশন ফাইল, যদি উপস্থিত থাকে।

বিদ্যমান API-এ পরিবর্তন

Android 10 এবং উচ্চতর ফাংশন set_cpuset_policy , set_sched_policy , এবং get_sched_policy এপিআই পরিবর্তন ছাড়াই রাখে৷ যাইহোক, Android 10 এই ফাংশনগুলিকে libprocessgroup এ স্থানান্তরিত করে, যা এখন সমস্ত cgroup-সম্পর্কিত কার্যকারিতা ধারণ করে।

যদিও cutils/sched_policy.h শিরোনাম এখনও বিদ্যমান, বিদ্যমান কোড ভাঙা এড়াতে নিশ্চিত করুন যে নতুন কোডের পরিবর্তে একটি নতুন processgroup/sched_policy.h হেডার অন্তর্ভুক্ত রয়েছে।

যে মডিউলগুলি এই ফাংশনগুলির যেকোনো একটি ব্যবহার করে তাদের মেকফাইলে libprocessgroup লাইব্রেরির উপর নির্ভরতা যোগ করা উচিত। যদি একটি মডিউল অন্য কোনো libcutils কার্যকারিতা ব্যবহার না করে, তাহলে makefile থেকে libcutils লাইব্রেরির নির্ভরতা বাদ দিন।

টাস্ক প্রোফাইল APIs

processgroup/processgroup.h এর ব্যক্তিগত APIগুলি টেবিলে সংজ্ঞায়িত করা হয়েছে:

টাইপ API এবং সংজ্ঞা
bool SetTaskProfiles(int tid, const std::vector & profiles) SetTaskProfiles(int tid, const std::vector & profiles)
একটি থ্রেড আইডি (tid) এর tid প্যারামিটার ব্যবহার করে নির্দিষ্ট করা থ্রেডে profiles নির্দিষ্ট করা টাস্ক প্রোফাইল প্রয়োগ করে।
bool SetProcessProfiles(uid_t uid, pid_t pid, const std::vector & profiles) SetProcessProfiles(uid_t uid, pid_t pid, const std::vector & profiles)
profiles নির্দিষ্ট করা টাস্ক প্রোফাইলগুলিকে তার ব্যবহারকারীর দ্বারা নির্দিষ্ট করা প্রক্রিয়ায় এবং uid এবং pid প্যারামিটার ব্যবহার করে প্রসেস আইডি প্রয়োগ করে
bool CgroupGetControllerPath(const std::string& cgroup_name, std::string* path)
cgroup_name দ্বারা নির্দিষ্ট করা একটি cgroup কন্ট্রোলার বিদ্যমান কিনা তা প্রদান করে; true হলে, সেই cgroup-এর রুটে path ভেরিয়েবল সেট করে
bool CgroupGetAttributePath(const std::string& attr_name, std::string* path)
attr_name দ্বারা নির্দিষ্ট করা একটি প্রোফাইল অ্যাট্রিবিউট বিদ্যমান কিনা তা প্রদান করে; যদি true , সেই প্রোফাইল অ্যাট্রিবিউটের সাথে যুক্ত ফাইলের পাথে path ভেরিয়েবল সেট করে।
bool CgroupGetAttributePathForTask(const std::string& attr_name, int tid, std::string* path)
attr_name দ্বারা নির্দিষ্ট করা একটি প্রোফাইল অ্যাট্রিবিউট বিদ্যমান কিনা তা প্রদান করে; যদি true , সেই প্রোফাইল অ্যাট্রিবিউটের সাথে যুক্ত ফাইলের পাথে এবং tid প্যারামিটার ব্যবহার করে থ্রেড আইডি দ্বারা নির্দিষ্ট থ্রেডে path ভেরিয়েবল সেট করে।
bool UsePerAppMemcg()
প্রতি-অ্যাপ মেমরি cgroups ব্যবহার করার জন্য সিস্টেম কনফিগার করা হয়েছে কিনা তা প্রদান করে।