प्रोसेस मेमोरी गार्जियन डीमन

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

आम तौर पर, ग्लोबल लो-मेमोरी किलर सिर्फ़ तब काम करते हैं, जब पूरे सिस्टम पर दबाव पड़ता है. हालांकि, पीएमजीडी एक खास तरीके से काम करता है. यह डेमॉन, टारगेट प्रोसेस के लिए कंट्रोल ग्रुप v2 मेमोरी वैल्यू की निगरानी करके काम करता है. जब कोई टारगेट प्रोसेस, कॉन्फ़िगर की गई मेमोरी की सीमाओं से ज़्यादा मेमोरी इस्तेमाल करती है, तो pmgd उस प्रोसेस को खत्म करने से पहले, Statsd मेमोरी ऐटम को लॉग करके, सीमाओं के उल्लंघन को हैंडल करता है.

यह कैसे काम करता है

यह डेमॉन, मेमोरी पर दबाव पड़ने वाले इवेंट (खास तौर पर, memory.events का इस्तेमाल करके, ज़्यादा मेमोरी इस्तेमाल करने वाली गतिविधि) को सुनने के लिए, inotify का इस्तेमाल करता है. जब निगरानी की जा रही कोई प्रोसेस, मेमोरी इवेंट को ट्रिगर करती है, तो pmgd ये कार्रवाइयां करता है:

  1. अनाम मेमोरी की जांच: प्रोसेस की अनाम मेमोरी का आकलन करता है. अगर यह कॉन्फ़िगर की गई anon_limit_in_mb से ज़्यादा है, तो pmgd तुरंत उस प्रोसेस को खत्म कर देता है.
  2. मेमोरी वापस पाने के लिए इंतज़ार की अवधि: अगर अनाम मेमोरी, तय की गई अनाम मेमोरी की सीमा से कम है, तो pmgd, सिस्टम के मेमोरी वापस पाने की अवधि (reclaim_wait_time_secs) तक इंतज़ार करता है.
  3. मेमोरी वापस पाने के बाद उसका आकलन: अगर ग्रेस पीरियड के बाद भी, टारगेट प्रोसेस की memory.current, memory.high से ज़्यादा या उसके बराबर रहती है या अनाम मेमोरी, anon_limit_in_mb से ज़्यादा हो जाती है, तो pmgd तुरंत उस प्रोसेस को खत्म कर देता है.

यह प्रोसेस तब तक चलती रहती है, जब तक प्रोसेस खत्म नहीं हो जाती या प्रोसेस की मेमोरी वापस पाने से, उसका मेमोरी का इस्तेमाल, तय की गई मेमोरी की सीमाओं से कम नहीं हो जाता.

सिस्टम की सेहत से जुड़ी सुविधाएं

  • रीबूट रेट लिमिटिंग: बूट लूप या लगातार क्रैश होने से रोकने के लिए, pmgd प्रोसेस खत्म होने की जानकारी ट्रैक करता है /data/misc/pmgd/history.json में. यह डेमॉन, डिवाइस के हर रीबूट पर, प्रोसेस को pmgd से शुरू होने वाले एक ही किल तक सीमित रखता है.

SELinux का कॉन्फ़िगरेशन

प्रोसेस की निगरानी करने की पीएमजीडी की क्षमता, SELinux की नीति से सीमित होती है. अगर आपने पीएमजीडी को ऐसी प्रोसेस की निगरानी करने के लिए कॉन्फ़िगर किया है जिसके डोमेन को नीति के तहत अनुमति नहीं है, तो पीएमजीडी उसकी निगरानी नहीं कर सकता. जैसे, वेंडर के हिसाब से सिस्टम प्रोसेस. साथ ही, आपको logcat में SELinux से जुड़ी गड़बड़ियां दिख सकती हैं.

पीएमजीडी को अन्य डोमेन में प्रोसेस की निगरानी करने की अनुमति देने के लिए, आपको पीएमजीडी के लिए अपने डिवाइस के हिसाब से SELinux की नीति को अपडेट करके, पीएमजीडी की अनुमतियां बढ़ानी होंगी.

यहां device/<vendor>/<device>/sepolicy/pmgd.te फ़ाइल का एक उदाहरण दिया गया है, जो नए डोमेन को ऐक्सेस करने की अनुमति देती है:

# Allow pmgd to access vendor_system_apps
r_dir_file(pmgd, vendor_system_apps)

डिवाइस के हिसाब से नीति लिखने के बारे में ज़्यादा जानने के लिए, SELinux लागू करने का तरीका पढ़ें.

वेंडर के हिसाब से कॉन्फ़िगरेशन

पीएमजीडी का कॉन्फ़िगरेशन, वेंडर के हिसाब से होता है. इसे /vendor/etc/pmgd/config.json नाम की ज़रूरी JSON फ़ाइल से कॉन्फ़िगर किया जाता है. इसमें, ट्रैक की जाने वाली प्रोसेस, cgroup टास्क प्रोफ़ाइल का इस्तेमाल करके, कॉन्फ़िगर की गई मेमोरी की सीमा की प्रोफ़ाइल, और मेगाबाइट में अनाम मेमोरी की ज़्यादा से ज़्यादा सीमा की जानकारी होती है.

वेंडर के कॉन्फ़िगरेशन के फ़ील्ड

दिया गया JSON कॉन्फ़िगरेशन, प्रोसेस और उनकी सीमाओं की सूची है. इसे इन फ़ील्ड से तय किया जाता है:

फ़ील्ड प्रकार ज़रूरी है ब्यौरा डिफ़ॉल्ट
target_cmd स्ट्रिंग हां निगरानी की जाने वाली टारगेट प्रोसेस का कमांड नेम. उदाहरण के लिए, system_server. लागू नहीं
uid पूर्णांक नहीं प्रोसेस का यूज़र आईडी (यूआईडी). अगर इसे छोड़ दिया जाता है, तो pmgd यह नियम ग्लोबल तौर पर, target_cmd से मेल खाने वाली किसी भी प्रोसेस पर लागू करता है. लागू नहीं
reclaim_wait_time_secs पूर्णांक नहीं मेमोरी की सीमा का फिर से आकलन करने से पहले, सिस्टम के मेमोरी वापस पाने के लिए इंतज़ार करने का ग्रेस पीरियड, सेकंड में. 5
mem_limit_profile स्ट्रिंग हां cgroup टास्क प्रोफ़ाइल का नाम, जो `memory.high` सेट करता है. इसका इस्तेमाल, प्रोसेस की मेमोरी की सीमा सेट करने के लिए किया जाता है. लागू नहीं
anon_limit_in_mb पूर्णांक हां मेगाबाइट में, अनाम मेमोरी की ज़्यादा से ज़्यादा सीमा. अगर अनाम मेमोरी का इस्तेमाल इस वैल्यू से ज़्यादा हो जाता है, तो pmgd तुरंत उस प्रोसेस को खत्म कर देता है. लागू नहीं
additional_task_profiles स्ट्रिंग की सूची नहीं किसी भी अन्य टास्क प्रोफ़ाइल की सूची, जिसे pmgd लागू करता है निगरानी शुरू होने पर प्रोसेस पर. खाली सूची

vendor/etc/task_profiles.json में, cgroup टास्क प्रोफ़ाइल के कॉन्फ़िगरेशन का एक उदाहरण यहां दिया गया है:

{
  "Attributes": [
    ...
    {
      "Name": "MemHigh",
      "Controller": "memory",
      "File": "memory.high"
    }
  ],
  "Profiles": [
    {
      "Name": "SystemServerMemoryHighLimit",
      "Actions": [
        {
          "Name": "SetAttribute",
          "Params":
          {
            "Name": "MemHigh",
            "Value": "1080M"
          }
        }
      ]
    }
  ]
}

vendor/etc/pmgd/config.json में, पीएमजीडी के कॉन्फ़िगरेशन का एक उदाहरण यहां दिया गया है:

{
  "targets": [
    {
      "target_cmd": "system_server",
      "uid": 1000,
      "reclaim_wait_time_secs": 5,
      "mem_limit_profile": "SystemServerMemoryHighLimit",
      "anon_limit_in_mb": 300
    }
  ]
}