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

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

সাধারণত গ্লোবাল লো-মেমরি কিলার তখনই কাজ করে যখন পুরো সিস্টেমের উপর চাপ থাকে, তবে PMGD গ্র্যানুলার অ্যাপ্রোচ নেয়। ডেমনটি এর টার্গেট প্রসেসের জন্য কন্ট্রোল গ্রুপ v2 মেমরি ভ্যালু মনিটর করার মাধ্যমে এটি অর্জন করে। কোনও টার্গেট করা প্রসেস কনফিগার করা মেমরি সীমা অতিক্রম করলে, pmgd প্রসেস বন্ধ করার আগে Statsd মেমরি অ্যাটম লগ করে সীমা লঙ্ঘন ম্যানেজ করে।

এটি কীভাবে কাজ করে

ডেমন inotify ব্যবহার করে মেমরি প্রেসার ইভেন্ট (বিশেষ করে memory.events ব্যবহার করে হাই-মেমরি অ্যাক্টিভিটি) শোনে। মনিটর করা প্রসেস যখন মেমরি ইভেন্ট ট্রিগার করে, তখন 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 নীতি আপডেট করে PMGD-এর অনুমতি বাড়াতে হবে।

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

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

ডিভাইস-নির্দিষ্ট নীতি লেখা সম্পর্কে আরও তথ্য পেতে, SELinux প্রয়োগ করুন দেখুন।

ভেন্ডর-সংজ্ঞায়িত কনফিগারেশন

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

ভেন্ডর কনফিগারেশন ফিল্ড

প্রদত্ত JSON কনফিগারেশন হল প্রসেস ও সেগুলির সীমা সংক্রান্ত তালিকা, যা নিম্নলিখিত ফিল্ড দ্বারা নির্ধারিত হয়:

ফিল্ড ধরন প্রয়োজনীয় বর্ণনা ডিফল্ট
target_cmd স্ট্রিং হ্যাঁ মনিটর করার জন্য টার্গেট প্রসেসের কমান্ডের নাম, যেমন, system_server। N/A
uid পূর্ণসংখ্যা না প্রসেসের ব্যবহারকারীর আইডি (UID)। বাদ দেওয়া হলে, pmgd প্রযোজ্য হয় target_cmd-এর সাথে ম্যাচ করা যেকোনও প্রসেসে বিশ্বব্যাপী নিয়ম প্রযোজ্য হয়। N/A
reclaim_wait_time_secs পূর্ণসংখ্যা না মেমরি সীমা আবার মূল্যায়ন করার আগে সিস্টেমকে মেমরি রিক্লেইম করার জন্য অপেক্ষা করার জন্য গ্রেস পিরিয়ড সেকেন্ডে দেওয়া হয়। 5
mem_limit_profile স্ট্রিং হ্যাঁ `memory.high` সেট করে এমন cgroup টাস্ক প্রোফাইলের নাম। এটি প্রসেস মেমরি সীমা সেট করতে ব্যবহৃত হয়। N/A
anon_limit_in_mb পূর্ণসংখ্যা হ্যাঁ মেগাবাইটে চূড়ান্ত বেনামী মেমরি সীমা। অপরিচিত মেমরি ব্যবহার এই ভ্যালু অতিক্রম করলে, pmgd অবিলম্বে প্রসেসটি বন্ধ করে দেয়। N/A
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
    }
  ]
}