Bölüm 1: Bu Nedir ve Neden Hayati Önem Taşır?
Mobil işletim sistemlerinde (özellikle Android/Linux çekirdeği tabanlı) fiziksel RAM kaynağının kısıtlılığı, çoklu görev (multitasking) performansını belirleyen kritik kısıtlama faktörüdür. Bu çalışma, sıkıştırılmış blok cihazı olan ZRAM, geleneksel depolama tabanlı swap alanları ve Linux çekirdeğinin bellek geri kazanım müdahelesi olan Low Memory Killer (LMK) algoritmasının üçgen ilişkisini ontolojik olarak çerçeveler. Temel yaklaşim, sayfa hatası (page fault) gecikmelerini minimize ederek Kullanıcı Deneyimi (UX) sürekliliğini sağlamak ve Uygulama Çökme Oranını (ACR) düşürmektir. Analiz, bellek basıncı (memory pressure) altındaki sayfa geri yazma (page reclaim) stratejilerini, oom_score_adj puanlama mekanizmasını ve kswapd/ksmd démon süreçlerinin etkileşimini kapsar. Metodolojik olarak; sanal bellek alanı (VMA) yönetimi, anonim sayfa (anonymous page) yaşam döngüsü ve flash depolama yazma dayanımı (TBW) kısıtlamaları üzerinden sistem stabilitesi ve performans optimizasyonu hedeflenmiştir.
Bölüm 2: Perde Arkası: Sistem Nasıl Çalışıyor?
ZRAM, RAM’in bir bölümünü LZ4, ZSTD veya LZO algoritmalarıyla sıkıştırılmış blok cihazı (/dev/zram0) olarak ayırarak sanal swap alanı yaratır. Fiziksel swap (eMMC/UFS) aksine, ZRAM I/O gecikmesini nanosaniyeye indirirken CPU döngüleri tüketir; bu trade-off, modern ARM big.LITTLE mimarilerinde küçük çekirdekler (LITTLE cores) üzerindeki sıkıştırma yükü dağıtılarak yönetilir. LMK ise oom_score_adj değerlerine göre (örneğin: HOME_APP = 0, VISIBLE_APP = 100, SERVICE = 200) süreçleri öldürür. Android 10+ (Kernel 4.9+) lmkd userspace démonuna geçiş yaparak, psi (Pressure Stall Information) metrikleriyle proaktif tetikleme sağlar. Mekanizma: Bellek basıncı eşiği aşıldığında -> kswapd sayfa temizleme başlatır -> Yetersizse lmkd SIGKILL gönderir. ZRAM burada “yazma önbelleği” (writeback buffer) görevi görerek anonim sayfaları sıkıştırıp tutar, fiziksel depolama yazmasını erteleder/engeller.
Bölüm 3: Bilim Dünyası ve Uzmanlar Nasıl İnceliyor?
Teknik değerlendirme; Linux Çekirdeği Bellek Yönetimi (MM) alt sisteminin vm.swappiness, vm.watermark_scale_factor, vm.page-cluster parametreleri üzerinden yapılır. Android Özel Standartları: ActivityManagerService (AMS) ProcessList sınıfı üzerindeki oom_adj seviyeleri ve lmkd konfigürasyon dosyası (/vendor/etc/lmkd.xml veya init.rc property’leri). Ölçüm Metodolojisi: perf, ftrace, vmstat (pgpgin/pgpgout, pswpin/pswpout), /proc/pressure/memory (PSI) metrikleri. Sıkıştırma Oranı (Compression Ratio) = orig_data_size / compr_data_size hedeflenir. Endüstri Protokolleri: JEDEC UFS 3.1/4.0 yazma dayanım standartları (TBW), Android CDD (Compatibility Definition Document) bellek minimumları (örn. Android 14: 2GB+). Test Senaryoları: monkeyrunner stres testleri, GameMode API entegrasyonlu öncelik artırımı, ADPF (Android Dynamic Performance Framework) termal kısıtlama altındaki davranış analizi.
Bölüm 4: Önemli Parametreler ve Karşılaştırma Rehberi
| Parametre | Ölçüt / Değer | Metrik | Stratejik Etki |
|---|---|---|---|
| ZRAM Algoritması | ZSTD (v1.4.8+) / LZ4 | Sıkıştırma Hızı (MB/s) & Oranı | ZSTD: Yüksek oran (~3-4x), orta CPU; LZ4: Düşük gecikme, düşük oran (~2x). |
| ZRAM Boyutu (Disksize) | Fiziksel RAM %50 – %75 | Kullanılabilir Sanal Bellek (MB) | Aşırı boyut OOM riskini artırır, küçüğü swap thrashing’e yol açar. |
| vm.swappiness | 60 (Varsayılan) -> 100 (Ağır Swap) | Swap Agresifliği | Düşük değer (10-30) anonim sayfa korur, yüksek değer dosya önbelleği korur. |
| LMK Minfree Seviyeleri | 18432,23040,27648,32256,55296,82944 (Sayfa cinsinden) |
Öldürme Eşiği (KB) | Düşük seviyeler arka plan uygulamalarını korur, sistem kararlılığını riske atar. |
| PSI (Pressure Stall Info) | some > 10ms / full > 5ms |
Gecikme Süresi (ms) | lmkd tetikleme hassasiyeti; full stall sistem donmasını, some tek süreç donmasını gösterir. |
| Writeback Limit | zram_writeback_limit_mb |
Yazma Hızı (MB/s) | Flash yazma yoğunluğunu sınırlayarak TBW ömrünü uzatır, gecikme artırır. |
| KSM (Kernel Samepage Merging) | Etkin / Devre Dışı | Sayfa Birleştirme Oranı (%) | Yedekli sayfaları birleştirir (KVM/Container için kritik), mobilde CPU maliyeti yüksek. |
| Watermark Boost Factor | watermark_boost_factor (0-10000) |
Kswapd Uyandırma Hızı | Yüksek değer kswapd‘yi erken uyandırır, ani gecikme piklerini önler. |
| Swap Free Notify | swap_free_low_percentage (10-20%) |
Boş Swap Yüzdesi | Kritik seviyede lmkd‘ye erken uyarı verir, OOM Killer devreye girmeden müdahale sağlar. |
| I/O Scheduler | bfq / kyber / none (ZRAM için) |
İstek Sıralama Gecikmesi | ZRAM için none (no-op) en düşük gecikmeyi verir; fiziksel swap için bfq adil paylaşım sağlar. |
Bölüm 5: Günlük Hayatta ve Doğada Nerede Karşımıza Çıkar?
Flagship cihazlarda (12GB+ RAM) ZRAM boyutu 4-6GB olarak ayarlanır, swappiness=100 ile agresif önceden yazma (proactive reclaim) yapılarak UFS yazma döngüleri minimize edilir; bu da “App Launch Latency”yi %15-20 azaltır. Orta segment (4-6GB RAM) cihazlarda zram_writeback etkinleştirilerek soğuk sayfalar (cold pages) UFS’ye asenkron yazılır, RAM basıncı anlık olarak %30-40 azaltılır. Giriş seviyesi (2-3GB RAM / Android Go) cihazlarda lmkd minfree eşikleri yükseltilir (arka plan süreçleri agresif öldürülür) ve ZRAM boyutu RAM’in %75’ine kadar çıkarılır; bu senaryoda zstd yerine lz4 tercih edilerek CPU yükü düşürülür. Oyun modunda (Game Mode API) oom_score_adj manuel -1000 (OOM_DISABLE) veya çok düşük değerlere çekilerek LMK’dan muafiyet sağlanır. Chromebook/Tablet modunda ksmd (KSM) etkinleştirilerek aynı kütüphaneleri paylaşan çoklu pencere örneklerinde fiziksel RAM tasarrufu %20-30 sağlanır.
Bölüm 6: Karşılaşılan Zorluklar ve Pratik Çözümler
Thrashing (Sayfa Çevrimi): Yetersiz ZRAM + Yüksek Swappiness -> CPU %100 sıkıştırma/açma döngüsüne girer, sistem donar. Çözüm: watermark_boost_factor artırma, swap_free_low_percentage ile erken LMK tetikleme. UFS Yaşlanması (Wear-out): Sürekli swap yazması TBW tüketir. Çözüm: zram_writeback_limit_mb (örn. 50MB/s) kotalama, fstrim periyodik çalıştırma. Öncelik Tersliği (Priority Inversion): Ön plandaki uygulama swap-out olursa gecikme artar. Çözüm: readahead_kb ayarlama, mlockall() kritik kütüphaneler için (system_server, surfaceflinger). Parçalanma (Fragmentation): Yüksek sıralı sayfa (high-order page) ayırma hataları. Çözüm: compact_memory tetikleme, page_group_by_mobility_disabler=0. Termal Kısıtlama: Sıkıştırma CPU ısısını artırır, throttling -> performans düşüşü döngüsü. Çözüm: ADPF Thermal Headroom API ile lmkd eşiklerini dinamik genişletme/daraltma. Gizlilik/Sızdırma: Swap alanında şifrelenmemiş hassas veri (şifreler, anahtarlar). Çözüm: ZRAM crypt opsiyonu (AES-XTS) veya dm-crypt entegrasyonu, CONFIG_ZRAM_WRITEBACK_ENCRYPT.
Bölüm 7: Gelecek Perspektifi ve Yeni Gelişmeler
Linux Kernel 6.6+ ve Android 14/15 (Vanilla Ice Cream) ekosisteminde zram çoklu akış (multi-stream) desteği (max_comp_streams = CPU çekirdek sayısı) ile sıkıştırma paralellik artırıldı. ZSTD 1.5.5+ uzun mesafeli eşleşme (long distance matching) ile %5-10 daha iyi oran sunar. Anonymous Page Folio Desteği (Kernel 6.1+), 4KB sayfa yerine 16KB/64KB folio yönetimiyle TLB miss ve metadata overhead’ini azaltır. Userfaultfd (UFFD) tabanlı Prefetching: Uygulama başlatma sırasında uffd ile sayfa hatası önceden tahmin edilip ZRAM’dan asenkron getirilir (Cold Boot Optimizasyonu). Genel Bakış: Gelecek 5-10 yılda CXL (Compute Express Link) Type 3 bellek genişletmesi mobil SoC’lerde (LPDDR5X/6) fiziksel RAM havuzunu paylaşıma açacak; ZRAM “son çare” swap’ten “ilk katman” önbelleğe evrilecek. ML Tabanlı LMK: lmkd yerini PSI + App Startup Time + Usage Stats verisiyle eğitilmiş hafif TensorFlow Lite modelleri alacak; süreç öldürme kararı “kullanıcı tahmini”ne dayalı olacak. Rust Çekirdek Modülleri: Bellek güvenliği kritik mm alt sistemine Rust entegrasyonu (Android 14+ rust binder driver örneği) use-after-free/double-free risklerini ortadan kaldıracak.
Bölüm 8: Merak Edilen Sorular ve Cevaplar
Soru 1: ZRAM fiziksel RAM’i tüketir mi, yoksa ekstra bellek mi yaratır?
Cevap: ZRAM fiziksel RAM’in bir kısmını (örneğin 4GB RAM’li cihazda 2GB) ayırarak bu alanı sıkıştırılmış blok cihazına dönüştürür. Sıkıştırma oranı 3x ise 2GB ham RAM ~6GB sanal swap alanı yaratır. Net kazanç: 2GB RAM harcanır, ~6GB swap kazanılır; efektif olarak ~4GB ekstra bellek kapasitesi sağlanır. CPU maliyeti bu dönüşümün bedelidir.
Soru 2: vm.swappiness=0 swap’i tamamen devre dışı bırakır mı?
Cevap: Hayır. swappiness=0 (Kernel 3.5+ sonrası), çekirdeğin “anonim sayfaları swap’e yazmaktan mümkün olduğunca kaçınacağını” belirtir, swap’i devre dışı bırakmaz. OOM durumunda yine swap kullanılır. Swap’i tamamen kapatmak için swapoff -a veya kernel parametresi noswap gerekir; ancak mobilde OOM Killer’ın anında devreye girmesine (uygulama kapanmasına) yol açar.
Soru 3: LMK ve Standart Linux OOM Killer arasındaki fark nedir?
Cevap: Standart OOM Killer (oom_killer), sistem genelinde bellek tükenmesi (global OOM) anında oom_score en yüksek süreci öldürür. LMK (Low Memory Killer / lmkd), Android’e özgü userspace bir démonudur; PSI metrikleri ve oom_score_adj (uygulama kategorisi) kullanarak proaktif ve kategorisel (arka plan önce, ön plan son) müdahale eder. Sistem donmasını (thrashing) önlemek için erken tetiklenir.
Soru 4: ZRAM için hangi sıkıştırma algoritması en iyisidir: LZ4 mü ZSTD mi?
Cevap: LZ4: Çok hızlı sıkıştırma/açma (GB/s seviyesinde), düşük CPU, ~2.1x oran. Düşük güçlü SoC’ler (Cortex-A53/A55) ve termal kısıtlı senaryolar için idealdir. ZSTD: Daha yavaş ama ~3.0-3.5x oran, CPU yoğun. Modern Flagship SoC’lerde (Cortex-X3/X4, A715) zstd varsayılan tercihtir; max_comp_streams ile paralellik sağlandığında throughput LZ4’e yaklaşıp oran üstündür.
Soru 5: zram_writeback özelliği ne işe yarar ve riskleri nelerdir?
Cevap: ZRAM dolduğunda en az kullanılan (cold) sıkıştırılmış sayfaları fiziksel depolamaya (UFS) yazmak için kullanılır. Bu, ZRAM basıncını azaltır. Risk: UFS yazma dayanımını (TBW) tüketir, yazma gecikmesi (write latency) anlık sistem takılmalarına (jank) yol açabilir. writeback_limit_mb ile bant genişliği kotalanmalıdır.
Soru 6: Android 13/14’te lmkd konfigürasyonu nasıl yapılır?
Cevap: Eski ro.lmk.* sistem property’leri yerini /vendor/etc/lmkd.xml (veya /system/etc/lmkd.xml) dosyası almıştır. Bu XML; minfree seviyeleri (sayfa cinsinden), oom_score_adj eşleşmeleri, memory_pressure_watch (PSI eşikleri), swap_free_low_percentage ve enable_userspace_lmkd bayraklarını içerir. OEM’ler bu dosyayı cihaz profiline (Go, Standart, Flagship) göre derleme anında paketler.
Bölüm 9: Bilmeniz Gereken Temel Terimler
Anonim Sayfa (Anonymous Page): Dosya sistemine (disk) bağlı olmayan, sadece bellekte bulunan ve swap alanına yazılabilecek veri sayfaları (Heap, Stack, mmap(MAP_ANONYMOUS)). ZRAM’in ana hedefidir.
PSI (Pressure Stall Information): Linux Kernel 4.20+ ile gelen, CPU/IO/Bellek kaynak contention’ını (çekişmesini) mikrosaniye hassasiyetinde ölçen metrik arayüzü (/proc/pressure/). lmkd tetikleyicisinin kalbidir.
OOM Score Adj (oom_score_adj): Sürecin Öldürülme Öncelik Puanı (-1000 ile +1000 arası). Negatif değer koruma, pozitif değer hedef belirtir. system_server -1000, Arka Plan Uygulaması +900 civarındadır.
Thrashing (Sayfa Çevrimi Çöketmesi): İşlemci’nin iş yapmaktan ziyade sayfa hatası işleme, swap-in/out yapmakla harcadığı durum. CPU %100, I/O %100, ilerleme ~0.
Folio (Sayfa Grubu): Kernel 6.1+ ile gelen, birden fazla fiziksel sayfayı (örn. 16KB, 64KB) tek bir nesne gibi yöneten veri yapısı. TLB verimliliğini ve kilit çekişmesini (lock contention) azaltır.
TBW (Terabytes Written): Flash depolama biriminin (UFS/eMMC) ömrünü belirleyen toplam yazılabilir veri miktarı. Swap yazımları TBW’yi tüketir.
Bölüm 10: Özet ve Çıkarılması Gereken Dersler
Mobil bellek yönetimi artık statik bir “swap alanı ayırma” operasyonundan, PSI tabanlı geri bildirim döngüleri, makine öğrenmesi destekli öngörülü müdahale (Predictive Reclaim) ve donanım hızlandırıcılı (HW Accelerated Compression) sıkıştırma katmanları içeren dinamik bir kontrol teorisi problemine evrilmiştir. ZRAM, UFS yazma dayanımı (TBW) ve gecikme (latency) kısıtlamaları altında “yazma önbelleği” (write-back cache) ve “sıkıştırılmış RAM havuzu” çift rolünü üstlenmiştir. LMK (lmkd), çekirdek alanından kullanıcı alanına taşınarak politika/ mekanizma ayrımını netleştirmiş, OOM Killer’ın körü körüne öldürme riskini, uygulama yaşam döngüsü bilinciliği (Lifecycle Awareness) ile değiştirmiştir. Karar Vericiler İçin Yol Haritası: 1) Donanım Seviyesi: LPDDR5X/6 + UFS 4.0 + Özel Sıkıştırma Hızlandırıcı (ZSTD/LZ4 HW) entegrasyonu zorunludur. 2) Çekirdek Seviyesi: Kernel 6.6+ (Folio, Multi-stream ZRAM, Rust MM) baz alınmalı, CONFIG_ZRAM_WRITEBACK_ENCRYPT etkin olmalı. 3) Framework Seviyesi: ADPF ve GameMode API’leri ile lmkd eşiklerinin termal ve kullanıcı senaryosuna göre dinamik ayarlanması (Dynamic Minfree). 4) Gözlemlenebilirlik: perfetto trace’leri ile mm_page_alloc, swap, psi event’lerinin sürekli profillemesi. Bu strateji; uygulama tutma oranını (Retention Rate) artırır, ANR (Application Not Responding) oranını düşürür ve flash ömrünü uzatarak BOM (Bill of Materials) maliyetini optimize eder.