Bellek yönetimi arka plan programı

Android 17 ve sonraki sürümlerde, sistem arka plan programı olan bellek yönetimi arka plan programı (mmd) desteklenir. Bu program, arka plan programı yapılandırmasını, ayarlanabilirleri ve devam eden takas veya ZRAM bakım görevlerini yönetir.

Arka plan

mmd kullanıma sunulmadan önce Android'in ZRAM yapılandırmaları parçalanmış durumdaydı ve sınırlı özelleştirme imkanı sunuyordu. mmd, ZRAM yönetimini merkezileştirerek, daha gelişmiş yapılandırma mantığına olanak tanıyarak ve yeni özelliklerin ve mimari iyileştirmelerin eklenmesini basitleştirerek bu sorunu ele alır. mmd ayrıca Java tabanlı system_server işlem ile çekirdek düzeyinde takas veya bellek yönetimi arasında net bir ayrım oluşturur.

Mimari ve ZRAM yönetimi

Önyükleme tamamlandığında (yani sys.boot_completed=1), mmd_setup belirtilen parametrelerle ZRAM'i yapılandırmaya çalışır. ZRAM kurulumu tamamlandıktan sonra sistem, devam eden bakım görevlerini işleyen mmd hizmetini etkinleştirir.

mmd projesinde, bakım işlemleri IMmd arayüzü kullanılarak mmd'ya Binder istekleri gönderilerek system_server'ten başlatılır. mmd, kendi dahili politika motoruna göre ZRAM geri yazma, yeniden sıkıştırma ve işlem başına geri yazma işlemlerini gerçekleştirerek bakım görevlerini yerine getirir. Hem ActivityManagerService'daki planlama hem de ZRAM bakım politikaları, sistem özellikleri kullanılarak yapılandırılabilir.

Sistem sunucusu entegrasyonu (system_server)

Java tabanlı system_server işlemi, mmd öğesinin ne zaman çağrılacağını belirler. Bu işlem, genel bakım taramalarını uygulama bazında hedeflenen bellek optimizasyonlarından ayırır.

Normal işleme sonrası bakım

Genel ZRAM bakımı, com.android.server.memory.ZramMaintenance kullanılarak ActivityManagerService tarafından gerçekleştirilir.

zram-maintenance

Şekil 1. ZRAM bakım planlama akışı.

  • Zamanlama motoru: ZramMaintenance, Android'in JobScheduler ile düzenli olarak arka plan görevi kaydeder.
  • İş kısıtlamaları: Ön plandaki kullanıcı arayüzünde takılmayı veya CPU çekişmesini önlemek için iş, setRequiresDeviceIdle(true) ve setRequiresBatteryNotLow(true) ile açıkça yapılandırılır.
  • Bağlayıcı tetikleme: Zamanlayıcı tetiklendiğinde onStartJob(), mmd.doZramMaintenanceAsync() çağrılır.system_server Bu, tek yönlü bir eşzamansız Binder çağrısıdır. system_server, bakım temizleme işlemlerinin tamamlanmasını beklerken engellemez. mmd, yeniden sıkıştırma ve geri yazma işlemlerini sırayla gerçekleştirmek için bunu arka plan çalışan iş parçacığına gönderir.

İşlem başına geri yazma

İşlem başına hedeflenen bellek çıkarma işlemi, ActivityManagerService tarafından com.android.server.am.CachedAppOptimizer kullanılarak yönetilir.

mmd-writeback

Şekil 2. İşlem başına mmd geri yazma akışı.

Bir işlem arka planda önbelleğe alınmış duruma geçtiğinde ActivityManager bellek sıkıştırması gerçekleştirir. İşlemin düşük bellek sorunu kullanıcıya görünürse (ör. işlem bir etkinliğe ev sahipliği yapıyorsa) ve ZRAM'in işleme göre geri yazması, işlemin bellek ayak izini sıfıra yakın bir değere getirirse sistem şu adımları uygular:

  1. Sıkıştırmanın ardından CachedAppOptimizer, dahili sıkıştırma işleyicisine mZramWritebackWaitSeconds gecikmeli bir ileti (ZRAM_WRITEBACK_MSG) gönderir.
  2. Gecikme süresi dolduğunda ActivityManager, güvenli bir işlem dosyası tanımlayıcısı pidfd açar.
  3. Sistem sunucusu mmd.asyncWritebackProcessZramMemory(pfd, callback) çağrısı yapar.
  4. mmd, işlem başına geri yazma ioctl'sini yürütür ve IMmdProcessWritebackCallback kullanarak geri bildirir. İşlem başarılı olursa ActivityManager, işlem kaydını (setIsZramWrittenBack(app, true)) işaretleyerek işlemin oom_score_adj değerini artırır ve metrikleri FrameworkStatsLog.ZRAM_WRITEBACK_EVENT'ye kaydeder.

İşlem başına ön getirme

Bir kullanıcı daha önce önbelleğe alınmış bir uygulamayı yeniden başlattığında (UNFREEZE_REASON_ACTIVITY nedeniyle dondurulmamış), ActivityManager, destekleme depolama alanından kaynaklanan büyük sayfa hatalarından kaynaklanan uygulama başlatma gecikmesini en aza indirir:

  1. CachedAppOptimizer, dondurmayı kaldırma etkinliğini yakalar ve prefetchZram(app) çağrısında bulunur.
  2. Sistem sunucusu, pidfd öğesini mmd.asyncPrefetchProcessZramMemory(pfd) kullanarak Binder üzerinden gönderir. mmd, ZRAM_ANDROID_IOC_PROCESS_PREFETCH ioctl'yi yayınlayarak çekirdeğe, uygulamanın ana kullanıcı arayüzü iş parçacığı başlatılırken takas edilen sayfaları eşzamansız olarak RAM'e geri getirmesini talimatını verir.

Bakım ve son işlem görevlerine genel bakış

Bu bölümde, takas alanını ve sistem belleğini optimize etmek için mmd tarafından çalıştırılan arka plan bakım işlemleri ve son işlem görevleri açıklanmaktadır.

mmd cinsinden bakım

mmd bölümünde bakım, etkin kullanıcı ön plan performansını etkilemeden takas alanı ve fiziksel bellek kullanımını optimize eden planlanmış, arka plan bakım taramalarını ifade eder. Sürekli ve eşzamanlı taramalar yapmak yerine (bu durum ciddi CPU uyandırmalarına ve kullanıcı arayüzünde takılmalara neden olur) bakım eşzamansız olarak yapılır:

  1. system_server, Binder'da periyodik olarak doZramMaintenanceAsync() tetikler.

  2. mmd, isteği arka plan çalışma sırasına yerleştirir LowPrioWorkItem::ZramMaintenance.

  3. mmd içinde hem yüksek öncelikli hem de düşük öncelikli bir kuyruğu yöneten tek bir çalışan iş parçacığı vardır. Yüksek öncelikli iş öğeleri (ör. işlem başına önceden getirme) önce işlenir ve düşük öncelikli iş öğelerinin önüne geçebilir. Bakım ve işlem başına geri yazma, düşük öncelikli iş öğeleri olarak çalışır. İş parçacığı oluşturulduğunda, çalışan iş parçacığı iki temel bakım işlemini sırayla yürütür:

    • ZRAM yeniden sıkıştırma: Mevcut takas sayfalarını tarar ve boşta duran sayfaları daha yüksek oranlı ikincil sıkıştırma algoritması (ör. zstd) kullanarak yeniden sıkıştırır.

    • ZRAM geri yazma: Boşta kalan sayfaları tarar ve bunları RAM'den tamamen çıkararak /data üzerindeki bir dosyadan döngü cihazı oluşturmak için destekleyici flash depolama alanına taşır.

ZRAM'deki işleme sonrası görevler

Linux çekirdeği ZRAM modülünde ve mmd mimarisinde, son işlem görevleri, çekirdeğin standart geri kazanma yolları (kswapd veya sıkıştırma) tarafından zaten takas edilmiş olan bellek sayfalarına sonradan uygulanan eşzamansız dönüşümlerdir.

Bir sayfa ilk kez yer değiştirildiğinde sistem hıza öncelik verir: Hızlı bir birincil sıkıştırma algoritması (ör. lz4) kullanır ve sıkıştırılmış sayfayı RAM'de saklar. Ancak zamanla, değiştirilen birçok sayfa soğuk veya boşta kalır. Örneğin, saatlerce devam ettirilmeyen, arka planda önbelleğe alınmış uygulamalar. Soğuk sayfaları hızlı ve az sıkıştırılmış ZRAM'de bırakmak verimsizdir.

İşleme sonrası ardışık düzeni

mmd, bu sayfaları optimize etmek için çok kademeli bir son işleme yaşam döngüsü uygular:

mmd-page-lifecycle

Şekil 3. mmd sayfa yaşam döngüsü.

  1. 1. aşama: İlk yer değiştirme (hızlı sıkıştırma): Bellek önce kswapd veya uygulama sıkıştırması aracılığıyla geri kazanılır. Genellikle bu ilk geri alma işlemi, lz4 gibi hızlı bir sıkıştırma algoritması kullanılarak gerçekleştirilir ve içerikler RAM'de depolanır.

  2. 2. aşama: Boşta işaretleme (eskime ve izleme): mmd Boşta izleme, çekirdek bellek izlemeye (CONFIG_ZRAM_TRACK_ENTRY_ACTIME) erişir veya sayfaların ne kadar süreyle dokunulmadan kaldığını izlemek için yazılım boşta işaretleyicisini kullanır.

  3. 3. aşama: İşlem sonrası 1 - yeniden sıkıştırma (bellek içi geri kazanma): Yeniden sıkıştırma boşta kalma süresine (min_idle_seconds ile max_idle_seconds arası) ulaşan sayfalar yeniden sıkıştırılır. mmd, çekirdeğe lz4 sayfasını sıkıştırmasını ve zstd kullanarak yeniden sıkıştırmasını söylemek için /sys/block/zram0/recompress yazıyor. Bu işlem, flash yazma yıpranmasına neden olmadan fiziksel RAM'i geri kazanır.

  4. 4. aşama: İşlem sonrası 2 - geri yazma (flash depolamaya çıkarma): Bellek baskısı devam ederse ve sayfalar geri yazma boşta kalma süresine (genellikle 20 saat veya daha fazla) ulaşırsa mmd geri yazmayı tetikler. mmd, /sys/block/zram0/idle ve /sys/block/zram0/writeback, sıkıştırılmış sayfayı RAM'den yedekleme amaçlı flash depolama alanına tamamen çıkarmak için yazar.

ZRAM kurulum yapılandırması

mmd, aşağıdaki ZRAM kurulum özelliklerini yükler ve işler:

Özellik Kullan Varsayılan
mmd.zram.enabled mmd ZRAM kurulumunun etkin olup olmadığı false
mmd.zram.num_devices Yapılandırılacak ZRAM cihazların sayısı. N numarası için sistem sys.boot_completed=1 değerini ayarlamadan önce zram0 ile zram<N-1> arasındaki cihazlar mevcut olmalıdır. ZRAM başına cihaz listesindeki özellikler cihaz başına yapılandırılabilir. 1
mmd.zram.device_priority swapon çağrılırken iletilecek öncelik değerleri. Ayarlanmadı
mmd.zram.comp_algorithm ZRAM sıkıştırma algoritması. Belirtilmezse çekirdeğin varsayılan sıkıştırma algoritması kullanılır. Ayarlanmadı
mmd.zram.size Bayt cinsinden ZRAM cihaz boyutu veya cihaz RAM boyutunun yüzdesi (örneğin, 75%). 50%
mmd.zram.writeback.enabled ZRAM geri yazma özelliğini etkinleştirme seçeneği. false
mmd.zram.writeback.device_size Geri yazma cihazının boyutu (bayt cinsinden) veya veri bölümünün yüzdesi. Gerçek cihaz boyutu, veri bölümünde bulunan alana göre ayarlanabilir. 1073741824 (1 GiB)
mmd.zram.writeback.min_free_space_mib Geri yazma cihazı kurulduktan sonra kullanılabilir olması gereken minimum boş alan (MiB). 1536 (1,5 GiB)
mmd.zram.writeback.use_nr_tags_prop true olduğunda, ZRAM geri yazma işlemini destekleyen döngü cihazının kuyruk derinliğini yapılandırmak için mmd.zram.writeback.nr_tags içindeki değeri kullanır. Bu, satıcı SELinux politikasının mmd'nın /data'yi destekleyen blok cihazının nr_tags'ını doğrudan okumasına izin verecek şekilde yapılandırılamadığı durumlarda kullanılan bir geçici çözümdür. false
mmd.zram.writeback.nr_tags mmd.zram.writeback.use_nr_tags_prop hükümlerini inceleyin. Ayarlanmadı
mmd.zram.recompression.enabled ZRAM yeniden sıkıştırma özelliğinin etkinleştirilip etkinleştirilmeyeceği. false
mmd.zram.recompression.algorithm İkincil ZRAM yeniden sıkıştırma algoritması. zstd

ZRAM başına cihaz özellikleri

mmd.zram.num_devices değeri birden büyük olduğunda, özellik tam olarak mmd.zram.num_devices öğe içeren virgülle ayrılmış bir değer olarak ayarlanarak ZRAM cihazı başına isteğe bağlı olarak yapılandırılabilir. Bu özellikler şunlardır:

  • mmd.zram.size
  • mmd.zram.comp_algorithm
  • mmd.zram.device_priority
  • mmd.zram.recompression.enabled
  • mmd.zram.recompression.huge_idle.enabled
  • mmd.zram.recompression.idle.enabled
  • mmd.zram.recompression.huge.enabled
  • mmd.zram.recompression.threshold_bytes
  • mmd.zram.recompression.algorithm
  • mmd.zram.writeback.device_size
  • mmd.zram.writeback.huge_idle.enabled
  • mmd.zram.writeback.idle.enabled
  • mmd.zram.writeback.huge.enabled

Mevcut ZRAM kurulumunun desteğinin sonlandırılması

Android'de ZRAM ve disk tabanlı takas alanı ayarlamak için swapon_all kullanılmaya devam etse de daha kolay yapılandırma ve ZRAM yeniden sıkıştırma gibi ileri seviye özellikler için ZRAM yönetiminde mmd tercih edilen yaklaşımdır.

mmd ZRAM kurulumu mmd.zram.enabled tarafından etkinleştirildiğinde:

  • swapon_all uygulamasında ZRAM kurulumu işlem yapmaz.
  • Yer paylaşımı config_zramWriteback dosyasındaki config.xml ve ro.zram.* geri yazma sistemi özellikleri gibi mevcut ZRAM yapılandırmaları yoksayılır.

ZRAM bakım ayarlanabilirleri

ZRAM bakımı kutudan çıkar çıkmaz çalışır ve bu bölümdeki sistem özelliklerini kullanarak daha da ince ayar yapabilirsiniz.

ZRAM bakım planlaması

Bu özellikler, ZRAM bakım görevlerinin system_server tarafından nasıl ve ne zaman planlanacağını kontrol eder.

Özellik Kullan Varsayılan
mm.zram.maintenance.first_delay_seconds İlk ZRAM bakımının başlatılmasından önceki gecikme. 3600 (1 saat)
mm.zram.maintenance.periodic_delay_seconds Sonraki ZRAM bakımı planlaması arasındaki gecikme. 3600 (1 saat)
mm.zram.maintenance.require_device_idle ZRAM bakımının yalnızca cihaz boştayken başlatılıp başlatılmayacağı. true
mm.zram.maintenance.require_battery_not_low ZRAM bakımı başlatılmadan önce pilin düşük olmamasının zorunlu olup olmayacağı. true

ZRAM geri yazma politikası

Aşağıdaki parametreler, ne zaman ve hangi tür belleğin destekleyici cihaza yazılacağını kontrol eder:

Özellik Kullan Varsayılan
mmd.zram.writeback.backoff_seconds Son geri yazma işleminden bu yana geçen geri yükleme aralığı. 600 (10 dakika)
mmd.zram.writeback.min_idle_seconds Bellek kullanım oranına göre bir sayfanın geri yazma için uygun olma durumunu hesaplamak üzere mmd.zram.writeback.max_idle_seconds ile birlikte kullanılır. Hesaplanan boşta kalma süresi, bellek baskısı altında değilken işi en aza indirmek için iki parametre arasında üstel olarak enterpolasyon yapılır. 72000 (20 saat)
mmd.zram.writeback.max_idle_seconds Bellek kullanımına göre boşta kalan sayfa yaşını dinamik olarak hesaplamak için kullanılan maksimum saniye sayısı. 90000 (25 saat)
mmd.zram.writeback.huge.enabled HUGE Sayfa geri yazma özelliğinin etkinleştirilip etkinleştirilmeyeceği false
mmd.zram.writeback.idle.enabled IDLE Sayfa geri yazma özelliğinin etkinleştirilip etkinleştirilmeyeceği true
mmd.zram.writeback.huge_idle.enabled HUGE_IDLE Sayfaya geri yazma özelliğinin etkinleştirilip etkinleştirilmeyeceği true
mmd.zram.writeback.min_bytes Boşta yazma işlemi sırasında geri yazılacak minimum bayt sayısı. 5242880 (5 MiB)
mmd.zram.writeback.max_bytes Bir boşta yazma geri yazma turunda geri yazılacak maksimum bayt sayısı. 314572800 (300 MiB)
mmd.zram.writeback.max_bytes_per_day 24 saatlik bir süre içinde geri yazılacak maksimum bayt sayısı. 25769803776 (24 GiB)
mmd.zram.writeback.limit.enabled Günlük geri yazma bütçe sınırı muhasebesinin etkinleştirilip etkinleştirilmeyeceği. true

ZRAM yeniden sıkıştırma politikası

Aşağıdaki parametreler, ne zaman ve hangi tür belleğin yeniden sıkıştırılacağını kontrol eder:

Özellik Kullan Varsayılan
mmd.zram.recompression.backoff_seconds Son yeniden sıkıştırmadan bu yana geçen geri yükleme aralığı. 1800 (30 dakika)
mmd.zram.recompression.min_idle_seconds Bellek kullanım oranına göre yeniden sıkıştırmaya uygun olması için bir sayfanın boşta kalma süresini hesaplamak üzere mmd.zram.recompression.max_idle_seconds ile birlikte kullanılır. Hesaplanan boşta kalma süresi, bellek baskısı altında değilken iş yükünü en aza indirmek için iki parametre arasında üstel olarak enterpolasyon yapılır. 7200 (2 saat)
mmd.zram.recompression.max_idle_seconds Boşta kalan sayfa yaşını dinamik olarak hesaplamak için kullanılan maksimum saniye sayısı. 14400 (4 saat)
mmd.zram.recompression.threshold_bytes Yeniden sıkıştırma için dikkate alınan ZRAM sayfalarının bayt cinsinden minimum boyutu. 1024 (1 KiB)
mmd.zram.recompression.huge.enabled HUGE sayfa yeniden sıkıştırmanın etkinleştirilip etkinleştirilmeyeceği true
mmd.zram.recompression.idle.enabled IDLE sayfa yeniden sıkıştırmanın etkinleştirilip etkinleştirilmeyeceği true
mmd.zram.recompression.huge_idle.enabled HUGE_IDLE sayfa yeniden sıkıştırmanın etkinleştirilip etkinleştirilmeyeceği true

ZRAM boşta sayfa izleme

mmd ZRAM bakımı, ZRAM sayfalarına son erişilmesinden bu yana geçen süreye göre bu sayfaları boşta olarak işaretler. Bu özellik için CONFIG_ZRAM_TRACK_ENTRY_ACTIME veya CONFIG_ZRAM_MEMORY_TRACKING çekirdek yapılandırmalarının etkinleştirilmesi gerekir. CONFIG_ZRAM_TRACK_ENTRY_ACTIME, GKI 6.18 ve sonraki sürümlerde varsayılan olarak etkindir. Daha önceki çekirdeklerde bellek ek yükü vardır ve varsayılan olarak etkin değildir.

Çekirdek yapılandırması etkin değilse mmd ZRAM bakımı, boşta kalan ZRAM sayfalarını izlemek için yazılım yedekleme mantığına geri döner:

  1. mmd başladığında tüm ZRAM sayfalarını boşta olarak işaretler.

  2. Gerekli geri çekilme süresi geçene kadar sonraki ZRAM bakımlarını atlayın.

  3. ZRAM yazma geri dönüşü veya boşta kalan sayfaları yeniden sıkıştırma. Geri yazma sınırları nedeniyle kalan boşta sayfalar varsa mmd, yeni sayfaları boşta olarak işaretlemeden (4. adımı atlayarak) sonraki bakımda sayfaları geri yazmaya devam eder.

  4. Tüm boşta kalan sayfalar geri yazılırsa tüm ZRAM sayfalarını tekrar boşta olarak işaretleyin ve 2. adıma geri dönün. ZRAM geri yazma devre dışı bırakılırsa mmd, yeniden sıkıştırma boşta kalma süresinden sonra ZRAM yeniden sıkıştırma işlemi gerçekleştiğinde tüm ZRAM sayfalarını boşta olarak işaretler.

Sorun giderme ve doğrulama kılavuzu

mmd ve ZRAM işlemlerini doğrulayıp teşhis etmek için aşağıdaki doğrulama adımlarını ve sorun giderme prosedürlerini kullanın.

ZRAM kurulumunu doğrulama

mmd'nın önyükleme sırasında ZRAM'i başarıyla yapılandırdığını doğrulamak için:

  1. Etkin sıkıştırma algoritmasını ve disk boyutunu kontrol edin:

    cat /sys/block/zram0/comp_algorithm
    cat /sys/block/zram0/disksize
    
  2. mmd sistem özelliklerini ve çalışan hizmet durumunu doğrulayın:

    getprop | grep mmd.zram
    dumpsys -l | grep mmd
    

ZRAM bakımını ve geri yazmayı doğrulama

ZRAM geri yazma ve yeniden sıkıştırma bakım görevlerinin çalıştığını doğrulayın:

  1. Destekleyen blok cihazın durumunu kontrol edin:

    cat /sys/block/zram0/bd_stat
    
  2. /sys/block/zram0/mm_stat izleyerek yeniden sıkıştırma verimliliğini kontrol edin. Sıkıştırılmış veri boyutlarındaki değişiklikler, bakım döngülerinden sonra görünür.

İşlem başına geri yazmayı doğrulama

Süreç başına geri yazma işlevinin çalıştığını doğrulamak için aşağıdakiler kullanılabilir:

  • Başarılı geri yazma günlükleri veya hata teşhisleri için adb logcat -s mmd bölümünü kontrol edin.

Sık karşılaşılan sorunlar ve teşhisler

Kullanıcının karşılaşabileceği yaygın hata durumları şunlardır:

  • WritebackDailyLimitExceeded: Bu hata, mmd.zram.writeback.max_bytes_per_day kotasına ulaşıldığını gösterir. Bu durumda mmd, 24 saatlik hareketli pencere ilerleyene kadar boşta yazma işlemini duraklatır.
  • Process prefetch or writeback failed: Bu hata, bir ioctl işlemi başarısız olduğunda logcat'te görülebilir. Bu durumun yaygın nedenleri:
    • EBADF veya ESRCH: Hedef işlem, mmd, pidfd öğesini çekirdeğe göndermeden önce sona erdi.
    • ENOSPC: Destekleyici depolama bölümü dolu veya döngü cihazı sırası tükendi.
  • ZRAM ayarlanmadı: mmd, başlatma sırasında ZRAM'i yapılandıramazsa bunun nedeni, mmd çalıştırılmadan önce eski swapon_all veya satıcı başlatma komut dosyalarının /dev/block/zram0'i kilitlemiş olması olabilir.