دیمن نگهبان حافظه فرآیند

اندروید ۱۷ و بالاتر از دیمن محافظ حافظه فرآیند (PMGD) پشتیبانی می‌کند، که با مدیریت پیشگیرانه استفاده از حافظه بر اساس هر فرآیند، از سلامت سیستم و تجربه کاربر محافظت می‌کند. این دیمن با اعمال سقف حافظه بر روی فرآیندهای هدف خاص، پایداری کلی دستگاه را بهبود می‌بخشد و تأیید می‌کند که نشت یا افزایش ناگهانی حافظه باعث کاهش عملکرد در کل سیستم نمی‌شود.

در حالی که قاتلان حافظه کم جهانی مرسوم فقط زمانی عمل می‌کنند که کل سیستم تحت فشار باشد، PMGD رویکردی جزئی‌تر اتخاذ می‌کند. این سرویس با نظارت بر مقادیر حافظه Control Group 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)

برای اطلاعات بیشتر در مورد نوشتن سیاست مختص دستگاه، به 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
    }
  ]
}