فرایند مخفی محافظ حافظه پردازش

‫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. این فهرست شامل فرایندهایی است که باید پیگیری شوند، نمایه محدودیت حافظه پیکربندی‌شده آن‌ها (بااستفاده از نمایه‌های وظیفه گروه کنترل)، و محدودیت حافظه ناشناس سخت‌گیرانه برحسب مگابایت.

فیلدهای پیکربندی فروشنده

پیکربندی JSON ارائه‌شده فهرستی از فرایندها و محدودیت‌های آن‌ها است، که با فیلدهای زیر تعریف شده است:

فیلد نوع الزامی شرح پیش‌فرض
target_cmd رشته بله نام فرمان فرایند هدف برای نظارت، برای مثال، system_server. موجود نیست
uid عدد صحیح نه شناسه کاربر (UID) فرایند. اگر حذف شود، pmgd قانون به‌صورت جهانی برای هر فرایندی که با target_cmd مطابقت داشته باشد اعمال می‌شود. موجود نیست
reclaim_wait_time_secs عدد صحیح نه مهلت ارفاقی برحسب ثانیه برای انتظار سیستم جهت بازیابی حافظه قبل‌از ارزیابی مجدد حد حافظه. 5
mem_limit_profile رشته بله نام نمایه تکلیف cgroup که `memory.high` را تنظیم می‌کند. این برای تنظیم حد حافظه فرایند استفاده می‌شود. موجود نیست
anon_limit_in_mb عدد صحیح بله حداکثر محدودیت حافظه ناشناس برحسب مگابایت. اگر استفاده از حافظه ناشناس از این مقدار فراتر رود، pmgd بلافاصله فرایند را متوقف می‌کند. موجود نیست
additional_task_profiles فهرست رشته‌ها نه فهرست هرگونه نمایه تکلیف اضافی که pmgd هنگام شروع پایش بر فرایند اعمال می‌کند. فهرست خالی است

در زیر نمونه‌ای از پیکربندی نمایه وظیفه cgroup در vendor/etc/task_profiles.json آمده است:

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

در زیر نمونه‌ای از پیکربندی PMGD در 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
    }
  ]
}