UKSM & KSM在Android上的表现

作为一个系统管理程序(hypervisor),Linux® 有几个创新,2.6.32 内核中一个有趣的变化是 KSM(Kernel Samepage Merging) 允许这个系统管理程序通过合并内存页面来增加并发虚拟机的数量。Linux UKSM 是国人自主研发的一个 Linux 内核相关项目,这个项目对服务器和桌面应用都可以显著的减少 Linux 系统冗余的内存,已经在 RHEL6、CentOS 6、Ubuntu 12.04 等系统充分验证和测试过。Linux相同页面合并机制(KSM)使得内存中相同的页面,可以通过修改页表的方式合并成一个。通常这个机制被应用在有众多虚拟机(目前仅支持 KVM)或者有很多冗余内存数据的场景(如有很多类似数据工作集的并行科学计算)里面。但是,目前它的实现方式仍然比较简陋,UKSM的出现,彻底消除了KSM原本局限,真正使得这项技术能被更多的普通用户使用。
众所周知,Android 内核衍生自Linux,但因平台特性,Android Kernel与 Linux Kernel演变出分歧,KSM和UKSM是意在解决内存冗余占用问题开发出的两个内核模块,他们在安装运行多个虚拟机宿主Host上表现相当出色。尤其是UKSM,较于KSM,有较高的性能、透明度和安全性,被广大Kernel内核开发人员和大型服务器用户所青睐。
我们的产品内存有限,合并冗余的内存占用,从内存优化的角度出发,KSM和UKSM无疑是比较好的选择。以下我们针对KSM和UKSM的表现作出测试,以作为UKSM和KSM是否登录产品的决策依据。
说明:KSM在Android Kernel 3.10时代就已经集成,内核开关为 CONFIG_KSM,依赖开关为CONFIG_MMU,UKSM为国人解决服务器冗余内存占用研发,可供参考的版本为0.1.2.3-for-v3.1 ~~~0.1.2.5-for-v3.18。

测试条件:
1.机型:(1G RAM/ MT6580);
2.平台:Android 7.1;
3.内核:Kernel 3.18
测试步骤:
测试机在内核中集成uksm模块,对比机关闭uksm模块,打开ksm开关,使用原生ksm模块做内存合并。测试机与对比机测试方法相同。正常开机开始统计数据(ksm和uksm守护进程CPU占用、整机内存剩余占用),开机手机静置10min,随即开始使用native应用test.bin进行内存申请和填充 “test 200 1”,申请200M内存,整块内存区域使用’1’填充,等待两分钟后重复申请填充,第4分钟同上,等待2分钟,终止数据抓取脚本。
测试原理:
测试机器在正常运行过程中,ksm/uksm对内存合并的积极性、合并效率(内存曲线展示)以及在此过程中的cpu开销(top数据体现)。

数据分析:
16min测试中对比机(ksm)和测试机(uksm)的内存波动。分析,在手机静置的10min中,uksm合并不如ksm积极,现象是在此过程中整机内存uksm略少于ksm,这一值约为30~40M。分别在10min、12min和14min时由test发起的内存申请可以看出,uksm对此200M内存的合并速度远远快于ksm,即uksm遍历合并完成200M内存耗时16s,而ksm完成此过程需要平均60s。
合并动作发生时的内存波动,可以直观展示合并效率
下面是top -m 50 中的ksmd/ukamd信息,可以看出uksm对CPU的利用率非常高,而就内存页检测而言,cpu占用稳定在1%一下,而此数据在ksmd上为均值26%,而且整机运行过程中,ksmd的cpu占用持续高波动,对功耗产生的压力较大。
这里写图片描述

这项数据表明,UKSM在Android上的表现确实优于KSM,无论从速度还是CPU资源消耗的角度。但是在小内存设备上并没有什么优势,亲测:累死累活得合并10~15M内存,功耗上来了,犯不着费这个劲,指着大内存设备上验证是否有用,毕竟国内的牛人当初整出来UKSM就是针对虚拟机服务器这种使用场景。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章