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.

Şekil 1. ZRAM bakım planlama akışı.
- Zamanlama motoru:
ZramMaintenance, Android'inJobSchedulerile 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)vesetRequiresBatteryNotLow(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_serverBu, 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.

Ş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:
- Sıkıştırmanın ardından
CachedAppOptimizer, dahili sıkıştırma işleyicisinemZramWritebackWaitSecondsgecikmeli bir ileti (ZRAM_WRITEBACK_MSG) gönderir. - Gecikme süresi dolduğunda ActivityManager, güvenli bir işlem dosyası tanımlayıcısı
pidfdaçar. - Sistem sunucusu
mmd.asyncWritebackProcessZramMemory(pfd, callback)çağrısı yapar. mmd, işlem başına geri yazma ioctl'sini yürütür veIMmdProcessWritebackCallbackkullanarak geri bildirir. İşlem başarılı olursa ActivityManager, işlem kaydını (setIsZramWrittenBack(app, true)) işaretleyerek işleminoom_score_adjdeğerini artırır ve metrikleriFrameworkStatsLog.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:
CachedAppOptimizer, dondurmayı kaldırma etkinliğini yakalar veprefetchZram(app)çağrısında bulunur.- Sistem sunucusu,
pidfdöğesinimmd.asyncPrefetchProcessZramMemory(pfd)kullanarak Binder üzerinden gönderir.mmd,ZRAM_ANDROID_IOC_PROCESS_PREFETCHioctl'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:
system_server, Binder'da periyodik olarakdoZramMaintenanceAsync()tetikler.mmd, isteği arka plan çalışma sırasına yerleştirirLowPrioWorkItem::ZramMaintenance.mmdiç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:

Şekil 3. mmd sayfa yaşam döngüsü.
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,
lz4gibi hızlı bir sıkıştırma algoritması kullanılarak gerçekleştirilir ve içerikler RAM'de depolanır.2. aşama: Boşta işaretleme (eskime ve izleme):
mmdBoş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. 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_secondsilemax_idle_secondsarası) ulaşan sayfalar yeniden sıkıştırılır.mmd, çekirdeğelz4sayfasını sıkıştırmasını vezstdkullanarak yeniden sıkıştırmasını söylemek için/sys/block/zram0/recompressyazıyor. Bu işlem, flash yazma yıpranmasına neden olmadan fiziksel RAM'i geri kazanır.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
mmdgeri yazmayı tetikler.mmd,/sys/block/zram0/idleve/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.sizemmd.zram.comp_algorithmmmd.zram.device_prioritymmd.zram.recompression.enabledmmd.zram.recompression.huge_idle.enabledmmd.zram.recompression.idle.enabledmmd.zram.recompression.huge.enabledmmd.zram.recompression.threshold_bytesmmd.zram.recompression.algorithmmmd.zram.writeback.device_sizemmd.zram.writeback.huge_idle.enabledmmd.zram.writeback.idle.enabledmmd.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_alluygulamasında ZRAM kurulumu işlem yapmaz.- Yer paylaşımı
config_zramWritebackdosyasındakiconfig.xmlvero.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:
mmdbaşladığında tüm ZRAM sayfalarını boşta olarak işaretler.Gerekli geri çekilme süresi geçene kadar sonraki ZRAM bakımlarını atlayın.
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.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:
Etkin sıkıştırma algoritmasını ve disk boyutunu kontrol edin:
cat /sys/block/zram0/comp_algorithm cat /sys/block/zram0/disksizemmdsistem ö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:
Destekleyen blok cihazın durumunu kontrol edin:
cat /sys/block/zram0/bd_stat/sys/block/zram0/mm_statizleyerek 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 mmdbö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_daykotasına ulaşıldığını gösterir. Bu durumdammd, 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:EBADFveyaESRCH: 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 eskiswapon_allveya satıcı başlatma komut dosyalarının/dev/block/zram0'i kilitlemiş olması olabilir.