Android系统在小内存下的使用

  最近在调试的方案,硬件配置是512MB的DDR,这在Android4.4这号称优化很大的系统版本上运行还是很吃力,找了一些资料,发现我们的方案上使用到了ZRAM这一技术,直接使用压缩内存来作为交换分区,其中涉及到的内核配置如下:
  CONFIG_SWAP=y
  CONFIG_CGROUP_MEM_RES_CTLR=y
  CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y
  CONFIG_ZRAM=y
  CONFIG_ZSMALLOC=y
  接下来运行起来后(如上述编译失败,需要把SYSFS和BLOCK相关配置加上),可以看到有/dev/block/zram0 这一结点,然后我们的方案在init.rc里加了一个service,其为oneshot类型,就是执行一个脚本了,脚本内容如下:
  #!/system/bin/sh
  echo $((256*1024*1024))  > /sys/block/zram0/disksize
  mkswap /dev/block/zram0
  swapon /dev/block/zram0
  sleep 1
  mkfs.ext2 -b 4096 /dev/block/zram0
  sleep 1
  mount -t rootfs -o remount -rw rootfs /
  mkdir /swap_zram0
  sleep 1
  mount -t rootfs -o remount -r rootfs /
  mount -t ext2 -o rw /dev/block/zram0 /swap_zram0
  这样的话,我们就有了一个交换分区来使用了,但发现使用free -m命令查看时,SWAP分区一直没有使用,并且一直有lowmemorykiller的操作,后来发现是我们的/sys/module/lowmemorykiller/parameters/minfree参数还是1GB DDR的配置,故而将其按一定比例调小后就可以了。
  对于/sys/module/lowmemorykiller/parameters/minfree,其6个值与/sys/module/lowmemorykiller/parameters/adj一一对应,而adj这个与每个进程的/proc/X/oom_adj有关系,其中oom_adj的值越小表示越重要,越不可能被杀掉,而adj对应的6组参数在Android源码的frameworks/base/services/java/com/android/server/am/ProcessList.java有其对应值,我们的平台为0,117,235,352,529,1000,相应的minfree在1GB时设置为2048,6144,7168,22528,25600,26624,在512MB时设置为2048,6144,7168,10240,15360,20480。在这里会根据每个进程的oom_adj的值去判断是属于adj的哪个范围,当内存小于minfree对就的值,就去杀掉adj对应范围内的oom_adj所对应的进程。
  如果SWAP分区不使用,我们还可以调整/proc/sys/vm/swappiness对应值,提升磁盘数据置换到SWAP的可能性,默认为60。
  如果不想APK对应的进程大容易被KILL掉,可以在AndroidManifest.xml里面加上android:persistent="true"配置。
  参考资料:http://blog.csdn.net/memoryjs/article/details/39048947
         http://blog.csdn.net/memoryjs/article/details/39053127
         http://blog.chinaunix.net/uid-20321537-id-3228776.html
         http://zhuanlan.zhihu.com/iobject/19608629
         http://blog.sina.com.cn/s/blog_60aa9ccd0100h433.html
         http://blog.csdn.net/zmyde2010/article/details/6756368

评论

此博客中的热门博文

I/O映射之I/O端口

通过Netlink检测网线插拔

使用seq_file