一 背景
现在安卓手机在相机操作下,不可避免要大量消耗内存资源,同时当今手机如同电脑一样,前台相机,后台各种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

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

5242

被折叠的 条评论
为什么被折叠?



