প্রসেস মেমরি গার্ডিয়ান ডেমন

অ্যান্ড্রয়েড ১৭ এবং এর পরবর্তী সংস্করণগুলো প্রসেস মেমোরি গার্ডিয়ান ডেমন (PMGD) সমর্থন করে, যা প্রতিটি প্রসেসের জন্য আলাদাভাবে মেমোরি ব্যবহার সক্রিয়ভাবে পরিচালনা করার মাধ্যমে সিস্টেমের স্বাস্থ্য এবং ব্যবহারকারীর অভিজ্ঞতা রক্ষা করে। এই ডেমনটি নির্দিষ্ট টার্গেট প্রসেসগুলোতে সুষ্ঠুভাবে মেমোরির সর্বোচ্চ সীমা প্রয়োগ করে ডিভাইসের সার্বিক স্থিতিশীলতা উন্নত করে এবং নিশ্চিত করে যে বিচ্ছিন্ন মেমোরি লিক বা স্পাইকের কারণে সিস্টেমব্যাপী পারফরম্যান্সের অবনতি না ঘটে।

প্রচলিত গ্লোবাল লো-মেমরি কিলারগুলো কেবল তখনই কাজ করে যখন পুরো সিস্টেম চাপের মধ্যে থাকে, কিন্তু PMGD একটি সূক্ষ্ম পদ্ধতি অবলম্বন করে। এই ডেমনটি তার টার্গেট প্রসেসগুলোর জন্য কন্ট্রোল গ্রুপ 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 কনফিগারেশন

PMGD-এর প্রসেস মনিটর করার ক্ষমতা SELinux পলিসি দ্বারা সীমাবদ্ধ। আপনি যদি PMGD-কে এমন কোনো প্রসেস মনিটর করার জন্য কনফিগার করেন যার ডোমেইন পলিসি দ্বারা অনুমোদিত নয়, যেমন কোনো ভেন্ডর-নির্দিষ্ট সিস্টেম প্রসেস, তাহলে PMGD সেটিকে মনিটর করতে পারবে না এবং আপনি logcat-এ SELinux ডিনায়াল দেখতে পারেন।

অতিরিক্ত ডোমেইনের প্রসেসগুলো নিরীক্ষণ করার জন্য PMGD-কে অনুমতি দিতে, আপনাকে অবশ্যই PMGD-এর জন্য আপনার ডিভাইস-নির্দিষ্ট SELinux পলিসি আপডেট করে এর অনুমতিগুলো প্রসারিত করতে হবে।

নিম্নলিখিতটি একটি device/<vendor>/<device>/sepolicy/pmgd.te ফাইলের উদাহরণ যা একটি নতুন ডোমেনে অ্যাক্সেস যোগ করে:

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

ডিভাইস-নির্দিষ্ট পলিসি লেখার বিষয়ে আরও তথ্যের জন্য, Implement SELinux দেখুন।

বিক্রেতা-নির্ধারিত কনফিগারেশন

PMGD কনফিগারেশন ভেন্ডর-চালিত, যা /vendor/etc/pmgd/config.json একটি আবশ্যক JSON ফাইলের মাধ্যমে কনফিগার করা হয়। এই ফাইলে ট্র্যাক করার জন্য প্রসেসগুলো, তাদের কনফিগার করা মেমরি লিমিট প্রোফাইল ( cgroup টাস্ক প্রোফাইল ব্যবহার করে), এবং মেগাবাইটে নির্ধারিত হার্ড অ্যানোনিমাস মেমরি লিমিটের তালিকা থাকে।

বিক্রেতার কনফিগারেশন ক্ষেত্রগুলি

প্রদত্ত JSON কনফিগারেশনটি হলো প্রসেস এবং তাদের সীমার একটি তালিকা, যা নিম্নলিখিত ফিল্ডগুলো দ্বারা সংজ্ঞায়িত করা হয়েছে:

মাঠ প্রকার প্রয়োজনীয় বর্ণনা ডিফল্ট
target_cmd স্ট্রিং হ্যাঁ যে প্রসেসটি মনিটর করতে হবে তার কমান্ডের নাম, যেমন, system_server প্রযোজ্য নয়
uid পূর্ণসংখ্যা না প্রসেসটির ইউজার আইডি (UID)। এটি বাদ দিলে, pmgd নিয়মটি target_cmd সাথে মিলে যাওয়া যেকোনো প্রসেসের ওপর বিশ্বব্যাপী প্রয়োগ করে। প্রযোজ্য নয়
reclaim_wait_time_secs পূর্ণসংখ্যা না মেমরি সীমা পুনরায় মূল্যায়ন করার আগে সিস্টেমকে মেমরি পুনরুদ্ধার করার জন্য অপেক্ষা করার অবকাশকাল (সেকেন্ডে)।
mem_limit_profile স্ট্রিং হ্যাঁ যে সিগ্রুপ টাস্ক প্রোফাইলটি `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 ফাইলে PMGD কনফিগের একটি উদাহরণ নিচে দেওয়া হলো:

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