zRAM, zSWAP与Android KitKat内存占用

转自:http://zhuanlan.zhihu.com/iobject/19608629


Android 4.4 KitKat的highlights里包括这样一条“减少”内存占用的措施:

swap to zRAM

zRAM是一个Linux内核驱动,从Linux 3.2版本开始进入内核的staging driver,亦即是处于测试阶段。zRAM大体上可以看成是用内存做一块虚拟盘,拿来作为Linux的交换分区。和普通的ramdisk不同,zRAM对存放的内容会进行实时的压缩,以提高实际的容量。

虽然zRAM到目前为止仍然是个staging driver,但其实已经被广泛用于生产环境,像电视机顶盒,ChromeOS以及CyanogenMOD家的Android。zRAM有望在3.12进入Linux内核的稳定驱动。

而KitKat之前的官方(AOSP)Android,一直是没有使用交换分区,所以也谈不上使用zRAM。我曾经试过使用交换分区的Android,发生交换时的那种缓慢程度,确实不如不要打开。

所以严格来讲利用zRAM并不是减小Android的内存占用,而是通过zRAM来提供交换空间,从而在内存紧张时释放出更多的可用内存,同时又避免传统的交换到文件系统的开销。

说到zRAM,就一定要提到zSWAP。最近infoQ中文刚好提供了CLK开发者大会上的一个presentation: 用内存压缩技术缓解磁盘读写过慢导致的性能下降,里面详细介绍了zSWAP,也简单提到了zRAM。

同zRAM不同的是,zSWAP并不虚拟一个块设备,而是hook到普通的swap代码里,在实际发生写入到磁盘/从磁盘读取的操作前,先利用自己管理的内存进行数据的换出/换入,内存不够用以后再使用传统的swap分区。所以zSWAP适用于本身已经有交换分区的系统,而zRAM更适合Android这样本身不配置交换分区的嵌入式系统。

题图是从上面提到的presentation里截的图。在使用硬件压缩的zSWAP的情况下,10G内存的机器在JVM heap size使用达到140%之前,SPECjbb benchmark仍然能跑出70%的性能;在使用普通的LZO压缩时也能达到50%的性能,对比直接交换到文件系统,提升非常显著。


你可能感兴趣的:(zRAM, zSWAP与Android KitKat内存占用)