Multi-Generational Least Recently Used

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/[email protected]/

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页表,调度器中的挂钩有助于跟踪自上次扫描以来实际运行的进程,因此可以跳过空闲进程。

你可能感兴趣的:(Multi-Generational Least Recently Used)