随着anroid 系统越来越庞大。“得屌丝者,得天下!” 是手机厂商的血液基因。“屌丝”代表成本的节省!而memory 显然是可以扣一口成本的。
为了更好的性能和节省更多的成本,ZRAM 来了。zram page writeback也来了。
ZRAM
- RAM是最快的内存类型,但是通常大小有限。高端设备通常具有最大数量的RAM。
- zRAM是用于交换空间的RAM的分区。将所有内容放入zRAM时都将进行压缩,然一般是3:1。然后系统再从zRAM中其解压缩如果需要用到相关的page。从而达到节省RAM 的目的
- 存储包,例如文件系统以及所有应用程序,库和平台的随附目标代码。 ZRAM _write Back
ZRAM 中有许多空闲页面,这些页面很少被使用,ZRAM 也占用了物理内存
这部分idle 的页面也是一种浪费。因此writeback 就是把相关的idle 页面和huge页面写回到storge里面。 然而 linux kernel 把相关的权限赋予了系统。只暴露了相关的节点。
代码语言:javascript复制backing_dev://zram 写到storge的地址。一般是/data/local/zram/xxx
echo xxx > /sys/block/zramX/backing_dev
//把不能压缩的page 写到 storage
代码语言:javascript复制
echo huge > /sys/block/zramX/write
//标记所有的page 为idle ,为写入storage 做准备
echo all > /sys/block/zramX/idle
//写入storage
echo idle > /sys/block/zramX/writeback
//避免过多的page 被写入storage 而影响性能,可以设置writeback的大小。
echo 1 > /sys/block/zramX/writeback_limit_enable
//限制writeback的大小
echo xxx >/sys/block/zramX/writeback_limit
//获取writeback使用情况
cat /sys/block/zram0/bd_stat
Android support
首先kernel 部分应该都支持(4.9/4.14/4.19/5.x)
Andorid frameworks 部分
frameworks/base/services/core/java/com/android/server/ZramWriteback.java
基本有如下prop 来控制。 在开机完成后会做一次writeback,然后按照相关的时间点定期做writeback。
- ro.zram.mark_idle_delay_mins: The time in minutes after boot up when the tracking of idle pages in zram is started. This delay should be sufficient enough to allow enough pages to be swapped out to zram.
- ro.zram.first_wb_delay_mins: Pages in zram that are idle for the time set by this property are uncompressed and written to the backing store. The job is constrained to run when the device is idle so that the increased IO during the writeback does not degrade used experience.
- ro.zram.periodic_wb_delay_hours: Delay between incremental writebacks after the first writeback.