安卓手机内存优化调研

本文探讨了Android系统中相机应用面临的内存压力问题,分析了memcg(内存控制组)的监控与抑制进程内存、内存分组的优缺点。针对memcg的迁移问题和安卓场景的特有缺陷,提出了前后台分组的挑战。此外,介绍了per_app_memcg作为优化方案,以及其在内存回收和效率上的优势与不足。最后,文章提到了appcompact技术在主动内存回收上的应用,并讨论了抑制后台进程内存分配的可能性,以提升相机性能。

一 背景

    现在安卓手机在相机操作下,不可避免要大量消耗内存资源,同时当今手机如同电脑一样,前台相机,后台各种app进程,都会消耗内存。因而会出现相机场景下,系统可用内存不足,内存压力增加不少,对相机性能会带来严重的影响。因此需要调查相机场景下的内存优化方法。

二 memcg调研

memcg的好处:

1 监控进程使用内存

站在一个普通Linux开发者的角度,如果能控制一个或者一组进程所能使用的内存数,那么就算代码有bug,内存泄漏也不会对系统造成影响,因为可以设置内存使用量的上限,当到达这个值之后可以将进程重启。

我们可以通过cgroup的事件通知机制来实现对内存的监控,当内存使用量穿过(变得高于或者低于)我们设置的值时,我们的程序就会收到通知。
ps: 应该是用Memory thresholds接口来进行监控的。

有个实际应用场景就是:比如可以我们的camera程序代码中设置监听接口,如果camera相关进程耗内存大于设置的阀值时,camera程序会及时收到相应的事件通知。

2 抑制进程使用内存

当某个mem cgroup里面物理内存达到上限(memory.limit_in_bytes)后,系统的默认行为是kill掉该cgroup中继续申请内存的进程,那么怎么控制这样的行为呢?答案是配置memory.oom_control。
这个文件里面包含了一个控制是否为当前cgroup启动OOM-killer的标识。如果写0到这个文件,将启动OOM-killer,当内核无法给进程分配足够的内存时,将会直接kill掉该进程;如果写1到这个文件,表示不启动OOM-killer,当内核无法给进程分配足够的内存时,将会暂停该进程直到有空余的内存之后再继续运行。
ps: memcg里面可以有选择的开启oom-killer,当不启动oom-killer时,如上面说的,就可以达到抑制进程内存使用效果吧。

3 体验系统对整机内存的优化思路

从kernel memcg的设计思路,结合手机Android场景,可以看到整机内存分3大块:

1) 用户态进程管理的内存

典型的特点是该内存可以在系统有内存压力时,被系统随时回收掉的。具体思路就是该内存必须挂到内核的Lru链表上,然后文件页或者被回写,或者被抛弃掉,匿名页被压缩写到zram中。

另外该内存可以被oom时通过杀进程方式直接释放掉的。

2) 内核管理的内存

比如内核态文件系统做io操作自身申请的内存,还有进程fork时需要内核申请的内存等这些都是属于内核管理的内存。

这部分内存直接特点就是:cached部分可以在有系统内存压力时,被回收掉(通过那个shrink_slab函数来做),非cached部分则无论怎么有系统压力,也不能被回收掉了。

所以内核态不要出现内存泄露问题,否则系统很难纠正。用户态出现内存泄露了,系统可以纠正错误的,直接oom或者通过Lru链表被匿名页回收了。

这部分内存管理,memcg是通过专门的memcg.kmem节点进行管理的,有区别于1)中的内存memcg管理。

3) 一些ion或者gpu驱动自身申请的内存

前两部分,内核态的内存管理都能cover到,memcg也能负责管理到。但是第3部分内存,memcg不能管理到,内核态内存管理仅仅在有内存压力时,会释放掉其中的cached内存。

并且这部分代码多位于driver/stanging目录下面,不是内核主线代码,所以内核内存管理方面对这部分也关注的不多,会有些bug问题的。

memcg缺陷:

1 通用的缺陷

当一个进程从一个cgroup移动到另一个cgroup时,默认情况下,该进程已经占用的内存还是统计在原来的cgroup里面,不会占用新cgroup的配额,但新分配的内存会统计到新的cgroup中(包括swap out到交换空间后再swap in到物理内存中的部分)。
我们可以通过设置memory.move_charge_at_immigrate让进程所占用的内存随着进程的迁移一起迁移到新的cgroup中。
注意:迁移内存占用数据是比较耗时的操作。还有可能会失败的。

ps: 系统缺省情况下,没有设置这个memory.move_charge_at_immigrate。因为如上面说的,频繁更换mem cgroup的话,会导致内核态工作异常耗时。

进一步确认:

xref: /Android-r/kernel/msm-4.19/Documentation/cgroup-v1/memory.txt文档里面核对过,上面的说法是正确的
(Note: If we cannot find enough space for the task in the destination cgroup, we try to make space by reclaiming

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值