Android 17 ve sonraki sürümlerde, süreç bellek koruyucu arka plan programı (PMGD) desteklenir. Bu program, süreç başına bellek kullanımını proaktif olarak yöneterek sistem sağlığını ve kullanıcı deneyimini korur. Daemon, belirli hedef süreçlerde bellek sınırlarını düzgün bir şekilde uygulayarak genel cihaz kararlılığını artırır. Ayrıca, yalıtılmış bellek sızıntılarının veya ani artışların sistem genelinde performans düşüşüne neden olmadığını doğrular.
Geleneksel küresel düşük bellekli sonlandırıcılar yalnızca sistemin tamamı baskı altındayken çalışırken PMGD ayrıntılı bir yaklaşım benimser. Daemon, hedef süreçleri için Control Group v2 belleği değerlerini izleyerek bunu başarır.
Hedeflenen bir işlem, yapılandırılmış bellek sınırlarını aştığında pmgd, işlemi sonlandırmadan önce Statsd bellek atomlarını kaydederek sınır ihlallerini ele alır.
İşleyiş şekli
Daemon, bellek baskısı etkinliklerini (özellikle memory.events kullanan yüksek bellek etkinliği) dinlemek için inotify kullanır. İzlenen bir işlem bellek etkinliğini tetiklediğinde pmgd aşağıdaki işlemleri gerçekleştirir:
- Anonim bellek kontrolü: İşlemin anonim belleğini değerlendirir. Yapılandırılan
anon_limit_in_mbdeğerini aşarsapmgdişlemi hemen sonlandırır. - Geri alma bekleme süresi: Anonim bellek, belirtilen anonim bellek sınırının altındaysa
pmgd, sistem geri alma için ek süre (reclaim_wait_time_secs) bekler. - Geri kazanma işleminden sonra bellek değerlendirmesi: Hedef işlemin
memory.currentdeğeri, ek süre sonundamemory.highdeğerinden büyük veya ona eşit kalırsa ya da anonim bellekanon_limit_in_mbdeğerini aşarsapmgdişlemi hemen sonlandırır.
Bu işlem, süreç sonlandırılana veya süreçteki geri kazanma işlemi bellek kullanımını belirtilen bellek sınırlarının altına düşürene kadar sürekli olarak yapılır.
Sistem sağlığı özellikleri
- Yeniden başlatma sıklık sınırlaması: Başlatma döngülerini veya kalıcı kilitlenmeleri önlemek için,
pmgd/data/misc/pmgd/history.jsoniçinde işlem sonlandırmalarını izler. Daemon, işlemleri cihaz yeniden başlatma başına tek birpmgdile başlatılan sonlandırma işlemiyle sınırlar.
SELinux yapılandırması
PMGD'nin süreçleri izleme özelliği, SELinux politikasıyla kısıtlanmıştır. PMGD'yi, alanına politika tarafından izin verilmeyen bir süreci (ör. tedarikçiye özel bir sistem süreci) izleyecek şekilde yapılandırırsanız PMGD bu süreci izleyemez ve logcat'te SELinux reddetme işlemleri görebilirsiniz.
PMGD'nin ek alanlardaki süreçleri izlemesine izin vermek için PMGD'ye yönelik cihaza özel SELinux politikanızı güncelleyerek PMGD'nin izinlerini genişletmeniz gerekir.
Aşağıda, yeni bir alana erişim ekleyen bir device/<vendor>/<device>/sepolicy/pmgd.te dosyası örneği verilmiştir:
# Allow pmgd to access vendor_system_apps
r_dir_file(pmgd, vendor_system_apps)
Cihaza özel politika yazma hakkında daha fazla bilgi için SELinux'u uygulama başlıklı makaleyi inceleyin.
Tedarikçi firma tarafından tanımlanmış yapılandırma
PMGD yapılandırması, satıcı tarafından yönlendirilir ve gerekli bir JSON dosyasıyla yapılandırılır
/vendor/etc/pmgd/config.json. Bu, izlenecek süreçleri,
yapılandırılmış bellek sınırı profillerini (cgroup görev profilleri kullanılarak)
ve megabayt cinsinden sabit anonim bellek sınırını listeler.
Tedarikçi yapılandırma alanları
Sağlanan JSON yapılandırması, aşağıdaki alanlarla tanımlanan işlemlerin ve sınırlarının bir listesidir:
| Alan | Tür | Zorunlu | Açıklama | Varsayılan |
|---|---|---|---|---|
target_cmd |
Dize | Evet | İzlenecek hedef işlemin komut adı (ör. system_server). |
Yok |
uid |
Tam sayı | Hayır | İşlemin kullanıcı kimliği (UID). Atlanırsa pmgd, target_cmd ile eşleşen tüm süreçlere kuralı genel olarak uygular. |
Yok |
reclaim_wait_time_secs |
Tam sayı | Hayır | Bellek sınırının tekrar değerlendirilmesinden önce sistemin belleği geri kazanması için beklenecek süre (saniye). | 5 |
mem_limit_profile |
Dize | Evet | `memory.high` değerini ayarlayan cgroup görev profilinin adı. Bu, işlem bellek sınırını ayarlamak için kullanılır. | Yok |
anon_limit_in_mb |
Tam sayı | Evet | Megabayt cinsinden nihai anonim bellek sınırı. Anonim bellek kullanımı bu değeri aşarsa pmgd işlemi hemen sonlandırır. |
Yok |
additional_task_profiles |
Dize listesi | Hayır | İzleme başladığında pmgd işlemin uygulandığı ek görev profillerinin listesi. |
Boş liste |
Aşağıda, vendor/etc/task_profiles.json içindeki cgroup görev profilinin örnek bir yapılandırması verilmiştir:
{
"Attributes": [
...
{
"Name": "MemHigh",
"Controller": "memory",
"File": "memory.high"
}
],
"Profiles": [
{
"Name": "SystemServerMemoryHighLimit",
"Actions": [
{
"Name": "SetAttribute",
"Params":
{
"Name": "MemHigh",
"Value": "1080M"
}
}
]
}
]
}
Aşağıda, PMGD yapılandırmasının vendor/etc/pmgd/config.json içindeki örnek yapılandırması verilmiştir:
{
"targets": [
{
"target_cmd": "system_server",
"uid": 1000,
"reclaim_wait_time_secs": 5,
"mem_limit_profile": "SystemServerMemoryHighLimit",
"anon_limit_in_mb": 300
}
]
}