Android 17 و نسخههای بالاتر از کارگزار نگهبان حافظه فرایند (PMGD) پشتیبانی میکند. این کارگزار با مدیریت پیشگیرانه استفاده از حافظه براساس هر فرایند، از سلامت سیستم و تجربه کاربر محافظت میکند. این دیمون با اعمال سقفهای حافظه بر فرایندهای هدف خاص، پایداری کلی دستگاه را بهبود میبخشد و تأیید میکند که نشت یا جهش حافظه مجزا باعث کاهش عملکرد در کل سیستم نمیشود.
درحالیکه قاتلان حافظه کم جهانی معمولی فقط زمانی عمل میکنند که کل سیستم تحت فشار باشد، PMGD رویکردی دقیقتر دارد. کارگزار این کار را با پایش مقادیر حافظه گروه کنترل v2 برای فرایندهای هدف خود انجام میدهد.
وقتی فرایند هدفگذاریشده از حد مجاز حافظه پیکربندیشده خود فراتر میرود، pmgd
با ثبت اتمهای حافظه Statsd قبلاز پایان دادن به فرایند،
تخلفات حد مجاز را مدیریت میکند.
روش کار
این دیمون از inotify برای گوش دادن به رویدادهای فشار حافظه (بهویژه
فعالیت حافظه بالا بااستفاده از memory.events) استفاده میکند. وقتی فرایند تحت نظارت،
رویداد حافظه را راهاندازی میکند، pmgd کنشهای زیر را انجام میدهد:
- بررسی حافظه ناشناس: حافظه ناشناس فرایند را ارزیابی میکند. اگر از
anon_limit_in_mbپیکربندیشده فراتر رود،pmgdبلافاصله فرایند را متوقف میکند. - دوره انتظار پسگیری: اگر حافظه ناشناس زیر حد مجاز حافظه ناشناس مشخصشده باشد،
pmgdمنتظر دوره مهلت پسگیری سیستم (reclaim_wait_time_secs) میماند. - ارزیابی حافظه پساز بازپسگیری: اگر
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
}
]
}