MGLRU
LRU的2.0升级版本
From google
合入13 AOSP,有望将减少 Chrome OS 和 Android 平台上 59% 以及 18% 的后台错杀
Background:
Android 屏幕较小,一般大量的应用都保持运行在后台,如何减少这些APP的内存占用?类似IOS的墓碑机制,其实android也可以冻结后台应用,但是因为没有GMS的推送服务,冻结后的应用收不到消息更新...所以国产终端厂商和互联网大厂都是采用白名单的方式,微信/淘宝/PDD啥的都不会去杀,然后就是按照优先级去杀,从后台不可感知应用-后台可以感知(即有service在运行)-刚切到后台....等等六个等级。但是目前来看,后台进程被kill依旧是安卓非常严重的问题,MGLRU有望做出改善!
patches link:
https://lore.kernel.org/lkml/20220706220022.968789-1-yuzhao@google.com/
gerrit:
https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/2991720
Introduce:
常规的lru介绍:https://cloud.tencent.com/developer/article/1884136 -> 预测错误,CPU负载高
比如一个顺序读写的应用,每个页都被读一遍,但是不会再读取,least-recently 就无效了。
MG LRU 做了两方面的修改
- 添加更多LRU列表,以覆盖当前active list 和 inactive list之间的范围,这些列表被称为“generations”。增加一些可能倾向于active或者可能倾向于inactive的generation. 随着时间推移,这些generations不断aging.
generations 可以从kernel config配置,手机配4,cloud配更多,因为cloud有更多的anon页面。回收从最后一代开始,
且更倾向于回收file-backed页面,目前file-back的要比anon的快一代。
一些规则:
1.刚执行page-fault的放在youngest generation
2.unmapped pages放在 second-youngest generation
3.要回写的file-back 页,放在second-oldest generation,减少回收
4.正在停用的页面将进入oldest generation
5.read()调用的页面讲会加入较old层,因为通常不会被使用
- 更改页面扫描的方式以减少其开销。
当前kernel通过扫描每个page,然后反向映射来确定相关进程的PTE. MGLRU直接扫描PTE页表,调度器中的挂钩有助于跟踪自上次扫描以来实际运行的进程,因此可以跳过空闲进程。