Cgroup ऐब्स्ट्रेशन लेयर

Android 10 और उसके बाद के वर्शन, कंट्रोल ग्रुप (cgroup) का इस्तेमाल करते हैं टास्क प्रोफ़ाइलों के साथ ऐब्स्ट्रैक्ट लेयर, जिसका इस्तेमाल डेवलपर किसी सेट की जानकारी देने के लिए कर सकते हैं (या सेट) का इस्तेमाल करें. इसके बाद, सिस्टम एक या उससे ज़्यादा टास्क चुनने के लिए, टास्क प्रोफ़ाइलों की बताई गई कार्रवाइयों को फ़ॉलो करता है ऐसे ग्रुप जिनके ज़रिए पाबंदियां लागू होती हैं. साथ ही, नीचे दिए गए cgroup सुविधा सेट को ज़्यादा सॉफ़्टवेयर पर असर डाले बिना बनाया जा सकता है लेयर.

cग्रुप के बारे में जानकारी

Cgroups, टास्क के सेट (जिसमें प्रोसेस, थ्रेड, और उनके सभी चाइल्ड शामिल होते हैं) को इकट्ठा करने और उनके पैटर्न के हिसाब से ग्रुप में बांटने का तरीका उपलब्ध कराता है. Android, इन ग्रुप को कंट्रोल करने और इनके लिए खाते का इस्तेमाल करने के लिए, cग्रुप का इस्तेमाल करता है सिस्टम के संसाधन, जैसे कि सीपीयू और मेमोरी के इस्तेमाल और डिस्ट्रिब्यूशन, Linux कर्नेल cgroups v1 और cgroups v2.

Android 9 और उससे पहले वाले वर्शन के लिए

Android 9 और उससे पहले के वर्शन में, init.rc शुरू करने वाली स्क्रिप्ट में उपलब्ध cग्रुप, उनके माउंटिंग पॉइंट, और वर्शन. हालांकि, ये बदल गया है, Android फ़्रेमवर्क ने के खास वर्शन और सबग्रुप की हैरारकी पर आधारित है. स्क्रिप्ट. इससे, इस्तेमाल करने के लिए अगला cgroup वर्शन चुनने या नई सुविधाओं का इस्तेमाल करने के लिए, cgroup के क्रम में बदलाव करने की सुविधा सीमित हो गई थी.

Android 10 और उसके बाद के वर्शन के लिए

Android 10 और उसके बाद के वर्शन में, टास्क प्रोफ़ाइलों वाले cग्रुप का इस्तेमाल किया जा सकता है:

  • Cgroup सेटअप. डेवलपर ने अपने cgroups.json में, cग्रुप के सेटअप के बारे में जानकारी दी है फ़ाइल का इस्तेमाल किया जा सकता है. सभी cgroups, शुरू करने की प्रोसेस के शुरुआती चरण के दौरान माउंट किए जाते हैं.
  • टास्क प्रोफ़ाइलें. ये एक ऐसा एब्स्ट्रैक्शन देते हैं जो ज़रूरी फ़ंक्शन को, लागू करने की जानकारी से अलग करता है. Android फ़्रेमवर्क, SetTaskProfiles और SetProcessProfiles एपीआई का इस्तेमाल करके, task_profiles.json फ़ाइल में बताई गई प्रोसेस या थ्रेड पर टास्क प्रोफ़ाइल लागू करता है. (ये एपीआई, Android 11 और उसके बाद के वर्शन के लिए खास हैं.)

पुराने सिस्टम के साथ काम करने की सुविधा देने के लिए, लेगसी फ़ंक्शन set_cpuset_policy, set_sched_policy और get_sched_policy एक जैसे एपीआई और फ़ंक्शन उपलब्ध कराते हैं, लेकिन उन्हें लागू करने के तरीके को टास्क प्रोफ़ाइलों का इस्तेमाल करने के लिए बदल दिया गया है. नए इस्तेमाल के लिए मामलों में एओएसपी लेगसी के बजाय, टास्क प्रोफ़ाइलों के नए एपीआई इस्तेमाल करने का सुझाव देता है set_sched_policy फ़ंक्शन का इस्तेमाल करना होगा.

Cgroups के ब्यौरे वाली फ़ाइल

ग्रुप के बारे में cgroups.json में बताया गया है <ANDROID_BUILD_TOP>/system/core/libprocessgroup/profiles/ में मौजूद फ़ाइल. हर कंट्रोलर के बारे में एक सब-सेक्शन में बताया गया है और उसका कम से कम ये होना ज़रूरी है:

  • कंट्रोलर फ़ील्ड से तय किया गया नाम.
  • माउंटिंग पाथ, जिसे पाथ फ़ील्ड से तय किया जाता है.
  • मोड, यूआईडी (यूज़र आईडी), और जीआईडी (ग्रुप आईडी), जिनसे मालिक की जानकारी मिलती है और इस पाथ में मौजूद फ़ाइलों के लिए ऐक्सेस मोड (सभी ज़रूरी नहीं हैं).
  • ज़रूरी नहीं विशेषता, इसे true पर सेट करें, ताकि सिस्टम माउंटिंग को अनदेखा कर सके 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 (cgroup v1 का ब्यौरा देता है) कंट्रोलर) और Cgroups2 (cgroup v2 कंट्रोलर के बारे में जानकारी देना). cgroups v2 हैरारकी में सभी कंट्रोलर एक ही जगह पर माउंट किए जाते हैं. इसलिए, Cgroups2 सेक्शन में उसका अपना पाथ, मोड, UID, और जगह की जानकारी और रूट बताने के लिए GID एट्रिब्यूट हैरारकी है. Cgroups2 में कंट्रोलर के लिए पाथ एट्रिब्यूट यह है उस रूट पाथ से मिलता-जुलता है. Android 12 और उसके बाद के वर्शन में, ग्रुप बनाया जा सकता है कंट्रोलर, जिसे पाथ और मोड के साथ "Optional" के तौर पर तय किया गया है इसे true पर सेट करके.

cgroups.json फ़ाइल को init प्रोसेस के तहत, शुरुआती इनिट के दौरान पार्स किया जाता है स्टेज है और cग्रुप तय की गई जगहों पर माउंट हो जाते हैं. बाद में पाने के लिए cgroup को माउंट करने की जगहों के लिए, CgroupGetControllerPath एपीआई फ़ंक्शन का इस्तेमाल करें.

टास्क की प्रोफ़ाइलों की फ़ाइल

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 कंट्रोलर का रेफ़रंस देता है फ़ाइल के नाम से.
  • फ़ाइल फ़ील्ड इस कंट्रोलर के तहत एक खास फ़ाइल को नाम देता है.

एट्रिब्यूट, टास्क प्रोफ़ाइल की परिभाषाओं में रेफ़रंस होते हैं. टास्क प्रोफ़ाइलों के अलावा, इनका इस्तेमाल सिर्फ़ तब करें, जब फ़्रेमवर्क को उन फ़ाइलों का सीधा ऐक्सेस चाहिए और टास्क प्रोफ़ाइलों का इस्तेमाल करके ऐक्सेस नहीं किया जा सकता. बाकी सभी मामलों में, टास्क प्रोफ़ाइल का इस्तेमाल करें. इससे, टास्क के काम करने के तरीके और उसे लागू करने के तरीके को अलग-अलग रखा जा सकता है.

प्रोफ़ाइल सेक्शन में, टास्क प्रोफ़ाइल की ये परिभाषाएं शामिल हैं:

  • name फ़ील्ड, प्रोफ़ाइल का नाम तय करता है.
  • कार्रवाइयां सेक्शन में, प्रोफ़ाइल लागू होने पर की गई कार्रवाइयों का एक सेट दिखता है. हर कार्रवाई में ये चीज़ें शामिल होती हैं:

    • नाम फ़ील्ड, कार्रवाई के बारे में बताता है.
    • पैरामीटर सेक्शन में, कार्रवाई के लिए पैरामीटर का एक सेट तय किया जाता है.

टेबल में इन कार्रवाइयों के बारे में बताया गया है:

कार्रवाई पैरामीटर ब्यौरा
SetTimerSlack Slack n में टाइमर स्लैक
SetAttribute Name एट्रिब्यूट सेक्शन में किसी एट्रिब्यूट के बारे में बताने वाला नाम
Value नाम वाले एट्रिब्यूट के ज़रिए दिखाई जाने वाली फ़ाइल में लिखी जाने वाली वैल्यू
WriteFileFilePathफ़ाइल का पाथ
Valueफ़ाइल में लिखी जाने वाली वैल्यू
JoinCgroup Controller cgroups.json से cgroup कंट्रोलर का नाम
Path cgroup कंट्रोलर की हैरारकी में सब-ग्रुप का पाथ

Android 12 और उसके बाद के वर्शन में, AggregateProfiles की सुविधा जोड़ी जा सकती है ऐसा सेक्शन जिसमें एग्रीगेट प्रोफ़ाइल होती हैं, जिनमें से हर एक सेट के लिए एक उपनाम है एक या ज़्यादा प्रोफ़ाइल. एग्रीगेट प्रोफ़ाइल की परिभाषाओं में ये चीज़ें शामिल होती हैं:

  • नाम फ़ील्ड, एग्रीगेट प्रोफ़ाइल का नाम बताता है.
  • प्रोफ़ाइल फ़ील्ड एग्रीगेट प्रोफ़ाइल.

जब एक एकीकृत प्रोफ़ाइल लागू की जाती है, तो सभी शामिल प्रोफ़ाइल भी अपने-आप लागू हो जाता है. एग्रीगेट प्रोफ़ाइल में दोनों व्यक्तिगत प्रोफ़ाइल हो सकती हैं या अन्य एग्रीगेट प्रोफ़ाइल हो सकती हैं, बशर्ते कि क्वेरी बार-बार न पड़ रही हों (एक प्रोफ़ाइल इसमें खुद शामिल होता है).

Task_profile init भाषा निर्देश

Android Init Language में task_profiles निर्देश Android 12 और उसके बाद वाले वर्शन के लिए उपलब्ध है, ताकि टास्क प्रोफ़ाइल को किसी खास प्रोसेस के लिए चालू किया जा सकता है. यह writepid कमांड (Android 12 में बंद कर दिया गया है) की जगह लेता है. इसका इस्तेमाल, किसी प्रोसेस को cgroups के बीच माइग्रेट करने के लिए किया जाता था. task_profiles कमांड की मदद से, ऊपरी लेयर पर कोई असर डाले बिना, लागू किए गए बदलावों को आसानी से बदला जा सकता है. नीचे दिए गए उदाहरण में, ये दोनों कमांड एक ही काम करते हैं:

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

    Android 12 में बंद कर दिया गया है. इसका इस्तेमाल, /dev/cpuctl/top-app/tasks फ़ाइल में मौजूदा टास्क का पीआईडी लिखने के लिए किया जाता था.

  • task_profiles MaxPerformance

    मौजूदा प्रोसेस को "सीपीयू" में टॉप-ऐप्लिकेशन ग्रुप में शामिल करता है कंट्रोलर (cpuctl) रिकॉर्ड करते हैं, जिसकी वजह से प्रोसेस का पीआईडी लिखा जाता है dev/cpuctl/top-app/tasks.

cgroup क्रम में मौजूद टास्क को इनमें माइग्रेट करने के लिए, हमेशा task_profiles निर्देश का इस्तेमाल करें Android 12 और उसके बाद के वर्शन. यह एक या उससे ज़्यादा पैरामीटर स्वीकार करता है, जो task_profiles.json फ़ाइल में दी गई प्रोफ़ाइलों के नाम.

एपीआई लेवल की हर टास्क प्रोफ़ाइल के हिसाब से

Android 12 और उसके बाद के वर्शन में, डिफ़ॉल्ट cgroups.json और task_profiles.json फ़ाइलों में मौजूद परिभाषाओं में बदलाव किया जा सकता है या उन्हें बदला जा सकता है. इसके लिए, Android API लेवल पर बदलाव किया जा सकता है या वेंडर के सेगमेंट से बदलाव किया जा सकता है.

एपीआई लेवल के आधार पर परिभाषाओं को बदलने के लिए, इन फ़ाइलों का होना ज़रूरी है डिवाइस पर मौजूद है:

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

    इसका इस्तेमाल, किसी एपीआई लेवल के लिए खास तौर पर बनाए गए cgroups के लिए करें.

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

    इसका इस्तेमाल, एपीआई लेवल के हिसाब से बनाई गई प्रोफ़ाइलों के लिए करें.

वेंडर पार्टीशन की परिभाषाओं को बदलने के लिए, इन फ़ाइलों का डिवाइस में मौजूद रहे:

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

अगर इन फ़ाइलों में किसी एट्रिब्यूट या प्रोफ़ाइल डेफ़िनिशन का नाम वही है जो डिफ़ॉल्ट फ़ाइल में है, तो फ़ाइल (एपीआई-लेवल या वेंडर-लेवल) की परिभाषा पिछली परिभाषा. यह भी ध्यान रखें कि वेंडर-लेवल की परिभाषाएं बदली जाती हैं एपीआई-लेवल की परिभाषाएं. अगर नई परिभाषा का कोई नया नाम है, तो विशेषताओं या प्रोफ़ाइलों में नई परिभाषा के साथ संशोधन किया गया है.

Android सिस्टम, cgroup और task_profile फ़ाइलों को इस क्रम में लोड करता है:

  1. डिफ़ॉल्ट cgroups.json और task_profiles.json फ़ाइलें.
  2. एपीआई लेवल के हिसाब से फ़ाइलें, अगर मौजूद हों.
  3. वेंडर पार्टीशन फ़ाइलें, अगर मौजूद हैं.

मौजूदा एपीआई में बदलाव

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 फ़ंक्शन, libcutils को छोड़ें createfile से लाइब्रेरी डिपेंडेंसी.

टास्क प्रोफ़ाइलों के एपीआई

processgroup/processgroup.h में निजी एपीआई की जानकारी टेबल में दी गई है:

टाइप एपीआई और परिभाषा
bool SetTaskProfiles(int tid, const std::vector& profiles)
profiles में बताई गई टास्क प्रोफ़ाइल को, इसके बताए गए थ्रेड पर लागू करता है थ्रेड आईडी (T) के लिए, tid पैरामीटर का इस्तेमाल किया जा सकता है.
bool 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 है, तो 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 है, तो path वैरिएबल को उस प्रोफ़ाइल एट्रिब्यूट से जुड़ी फ़ाइल के पाथ पर सेट करता है. साथ ही, tid पैरामीटर का इस्तेमाल करके, थ्रेड आईडी से तय की गई थ्रेड पर भी सेट करता है.
bool UsePerAppMemcg()
यह बताता है कि सिस्टम को हर ऐप्लिकेशन के लिए मेमोरी cgroups का इस्तेमाल करने के लिए कॉन्फ़िगर किया गया है या नहीं.