اندروید ۱۷ و بالاتر از دیمن محافظ حافظه فرآیند (PMGD) پشتیبانی میکند، که با مدیریت پیشگیرانه استفاده از حافظه بر اساس هر فرآیند، از سلامت سیستم و تجربه کاربر محافظت میکند. این دیمن با اعمال سقف حافظه بر روی فرآیندهای هدف خاص، پایداری کلی دستگاه را بهبود میبخشد و تأیید میکند که نشت یا افزایش ناگهانی حافظه باعث کاهش عملکرد در کل سیستم نمیشود.
در حالی که قاتلان حافظه کم جهانی مرسوم فقط زمانی عمل میکنند که کل سیستم تحت فشار باشد، PMGD رویکردی جزئیتر اتخاذ میکند. این سرویس با نظارت بر مقادیر حافظه Control Group 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)
برای اطلاعات بیشتر در مورد نوشتن سیاست مختص دستگاه، به Implement SELinux مراجعه کنید.
پیکربندی تعریفشده توسط فروشنده
پیکربندی PMGD توسط فروشنده هدایت میشود و توسط یک فایل JSON مورد نیاز /vendor/etc/pmgd/config.json پیکربندی میشود. این فایل، فرآیندهایی را که باید ردیابی شوند، پروفایل محدودیت حافظه پیکربندی شده آنها (با استفاده از پروفایلهای وظیفه cgroup ) و محدودیت حافظه هارد آنیموس (hard anonymous) را بر حسب مگابایت فهرست میکند.
فیلدهای پیکربندی فروشنده
پیکربندی JSON ارائه شده، فهرستی از فرآیندها و محدودیتهای آنهاست که توسط فیلدهای زیر تعریف میشوند:
| میدان | نوع | مورد نیاز | توضیحات | پیشفرض |
|---|---|---|---|---|
target_cmd | رشته | بله | نام فرمان فرآیند هدف برای نظارت، برای مثال، system_server . | ناموجود |
uid | عدد صحیح | خیر | شناسه کاربری (UID) فرآیند. در صورت حذف، pmgd قانون را به صورت سراسری برای هر فرآیندی که با target_cmd مطابقت دارد، اعمال میکند. | ناموجود |
reclaim_wait_time_secs | عدد صحیح | خیر | دوره زمانی مجاز بر حسب ثانیه برای انتظار جهت بازیابی حافظه توسط سیستم، پیش از ارزیابی مجدد محدودیت حافظه. | ۵ |
mem_limit_profile | رشته | بله | The name of the cgroup task profile that sets `memory.high`. This is used to set the process memory limit. | ناموجود |
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
}
]
}