深度剖析,移动设备场景下OPPO基于用户体验优化Linux内核

深度剖析,移动设备场景下OPPO基于用户体验优化Linux内核

以“自由、协作、创新”为理念,以推动和普及开源技术为使命,第18届“中国Linux内核开发者大会”(以下简称CLK)在10月28日于深圳正式开幕。受CLK组委会委托,本届大会由OPPO承办。大会设置主论坛,以及内存管理、云和服务器、Arch&虚拟化&I/O、调试/eBPF/调度四个分论坛,会上,OPPO围绕内存优化和内核调度等课题进行了主题演讲。

基于用户体验,多维度改善Linux内核

手机如何久用如新,长用不热,启切丝滑?对日益丰富繁杂的手机场景用户需求,原有的Linux内核无法提供有力的支撑。目前Linux在移动平台普遍存在四类问题:
•CPU资源调度问题:资源不公平分配、异构场景下实时调度差、传统负载追踪算法对快速变化反应慢、功耗和响应之间没有很好平衡等影响性能与用户体验
•内存问题:内存泄漏、内存碎片化、用户体验线程无法及时获取内存资源、内存回收线程负载高都会引起流畅性问题及发热问题。
•锁竞争问题:低优先级任务持锁后无法及时释放,队列深度过长、批量readers唤醒涌入临界区等导致负载突增,产生卡顿。
•IO资源调度问题:器件末端性能、IO资源分配不合理、碎片化导致IO响应慢。
此次OPPO平台软件开发中心GM、软件系统优化技术专家许珉嘉分享了ColorOS下基于用户体验改善的Linux内核优化方案,许珉嘉强调:手机与桌面和服务器系统,无论在硬件架构、软件架构和用户关切上都存在非常大的差异,这要求我们在Linux OS层面从各个维度进行针对移动设备场景的优化
标准 Linux 内核对比基于用户体验的 ColorOS 内核
(标准 Linux 内核对比基于用户体验的 ColorOS 内核)

提升内存分配效率,降低内存回收负载

伴随内存器件容量越来越大,应用对内存的需求也越来越大。而当内存分配及回收出现问题,表现则会出现卡顿、发热严重、耗电、APP启动速度慢等现象,那么如何处理这些问题?
ColorOS通过多年技术沉淀,总结了多种Linux内核在移动场景下提高大块内存的分配速度的可落地方案。本次内存管理分论坛上,李培锋、韩传华、胡俊鹏三位老师在不同维度带来了实用的技术分享。
在这里插入图片描述

页面回收的卡锁与高负载处理

本次OPPO高级底层软件工程师李培锋分享了《shrink_slabd: 异步slab shrinker以减小内存回收延迟》与《针对page映射频度和lock contention的LRU回收优化》课题;通过shrink_slab异步化的方式,解决shrinker callback阻塞导致内存回收延迟问题,对于页面回收的反向映射,李培锋抛出了高负载、卡锁两个经典问题。
在这里插入图片描述
在这里插入图片描述

该优化中提及的高负载,指的是在手机低内存场景下,内存回收中的页面反向映射操作占据kswapd/direct_reclaim 的负载过高,内存回收操作抢夺CPU资源,导致CPU资源紧张,同时也会导致温升问题。而内存回收中页面的反向映射涉及的卡锁问题,主要是获取文件页面的address_space->i_mmap_rwsem或者匿名页面anon_vma->root->rwsem的过程中,卡锁会导致内存回收效率低,更严重的是如果用户体验等关键线程因为内存紧张进入直接内存回收后,卡在该锁则可能会引起严重的卡顿问题。
那么如何对于这类问题进行优化,OPPO高级底层软件工程师李培锋提出了自己的思路:对于高负载场景中非强制性的回收场景,尽量减少回收page_mapcount大的页面。通过判断page_mapcount大页面总数、可用内存、内存回收效率等指标高于阈值,才进行page_mapcount大页面进行的回收,通过处理队列的逻辑优化,内存回收负载整体降低30%。
在这里插入图片描述

而对于卡锁问题,非强制性的回收采用rwsem_trylock+异步回收的方式。解决因反向映射rwsem锁竞争,导致的用户线程阻塞以及内存回收效率低的问题。
在这里插入图片描述

移动场景动态大页优化,减少缺页异常

现有大页技术目前主要应用于服务器领域,HugeTLB、THP等大页方案在移动端的表现并不友好,换言之,Android手机领域没有成熟的可借鉴方案。
对于移动场景动态大页的必要性不言而喻,OPPO高级底层软件工程师韩传华在《动态大页:基于ARM64 contiguous PTE的64KB HugePage/Large Folios》课题中阐述了OPPO的动态大页方案。
OPPO的动态大页利用arm64平台上的CONT-PTE硬件特性,通过最后一级页表的16个连续的页表项来实现64k动态大页。16个pte只需要一个tlb表项。动态大小页混合,采用4KB的页粒度,CONT-PTE构建64KB大页的形式。
OPPO动态大页方案实现了大页整体swapin/swapout、异步回收/大小页平衡、大页池管理、双lru系统等优化措施,提高效率,并通过双zRAM系统,大小页独立压缩解压,大幅提升了压缩率,并且能较好地覆盖缺页异常处理,
在这里插入图片描述

韩传华介绍,与4K页粒度相比,64K动态大页在内部实验室的性能表现非常优秀,其中dtlb miss率降50%+,缺页次数降低89%,缺页频率下降56%,执行指令数下降75.2%
对于用户角度,内存压缩率提升30%+,16GB机器多后台重载场景压缩节省800M+,丢帧减少提升35%+,连续启动应用效率提升10%+。

基于冷热文件的冷热区域精准地回收

在服务器场景下,数目繁多的文件读写后,累计产生海量的pagecache。这种现象容易引发一系列内存问题:
1:可直接分配内存太少,业务进程内存分配时阻塞,性能抖动
2:内存碎片,可直接分配的连续物理内存太少
3:网卡软中断分配page失败,频繁触发dump_stack告警,甚至crash
在这里插入图片描述

OPPO高级后端工程师胡俊鹏在《异步内存回收新思路探索--基于冷热文件的冷热区域精准地回收冷文件页page》课题中,胡俊鹏指出,对于产生pagecache 几百M但大部分pagecache都很少读写的文件,需优先回收这种文件的冷文件页,通过file_area间接判断文件页page的冷热,以文件为单位进行内存回收,可以有效处理pagecache堆积。
胡俊鹏通过案例细化思路,利用radix tree快速查找的特性,每次文件页page被读写后,从radix tree快速找到对应区域的file_area指针,然后增加文件page的访问次数。既做到性能损耗低,还能精确统计文件页page的访问频次。
在实验场景下进行多次实验。基于冷热文件的冷热区域精准的回收方案,精确统计了文件页page的访问频次,在此基础上计算出文件pagecache的冷区域与热区域的占比,继而判断出热文件和冷文件。内存回收时优先找出大部分pagecache不经常访问的冷文件(尤其是大的冷文件),避开热文件,继而高效回收大量冷文件页。另一个大的优化点是,如果文件页page内存回收后又被访问,发生了refault。则把该page所属的file_area移入所属文件的refault链表,后期长时间禁止再回收这个page。这个措施可以有效避免频繁refault。
该方案对内核改动极小,并且有效节省大量内存,CPU消耗低,有效避免了频繁refault。

用户感知任务与调度优化方案

Arch&虚拟化&I/O分论坛上,OPPO高级底层软件工程师胡璞与谢柳杰则分别带来了《基于任务调度延迟的balance方案》《User Aware Lock:关注用户感知任务的内核锁调度与排队优化策略》课题。
胡璞通过三个维度的balance策略,对交互敏感型任务的调度延迟进行优化,多个监控指标下实验室数据反馈良好。
1.在线程创建(fork)/唤醒(wakeup)时,为线程选择合适的CPU,避免将交互敏感型任务放到算力较弱或处于深睡眠状态的CPU上,同时做好与其他高优先级任务的互斥工作。
2.在tick中周期性地对Local CPU队列中的任务进行检查。如果存在因算力不足而造成长时间运行的交互敏感型任务,则主动将其迁移到算力更强劲的CPU上;如果存在长时间处于等待状态的交互敏感型任务,则主动将其迁移到其他可用的CPU上。
3.当某个CPU上没有可运行的任务,即将进入idle状态时,(即new idle时机),主动去检查系统中的其他CPU上是否存在需要帮助的交互敏感型任务,(例如因CPU算力不足而引起的长时间运行,或者因为当前CPU关闭抢占造成长时间处于等待状态),如果有的话,则主动将这些交互敏感型任务拉取到本地运行。
在这里插入图片描述

内核锁调度策略

作为长期在一线攻关性能问题的工程师,谢柳杰以界面滑动、切换、应用启动等实际用户场景为例,说明锁优化对实际用户体验的重要性,最后指出, 真正的user,其实是那些访问内核锁且承担用户核心体验的一类线程。通过内核锁调度,等锁的排队优化,可以让用户得到较大的体验提升。
在这里插入图片描述

谢老师所在的内核锁团队,在调度侧的优化主要是通过精准传递ux-property和设置临界区保护带实现。
目前CFS任务是靠vruntime作为key值来插入红黑树,然后调度器来做选择的,在这种机制下,持锁owner无法保证低延迟性。而拥有ux-property的任务,则具备优先调度的特性。对于能找到明确单一owner的阻塞场景,准确传递ux-property给到持锁owner,覆盖用户关注线程的阻塞至唤醒整个阶段。对于未能明确或存在多个owner的场景,采用临界区保护带进行保护,避免临界区线程被普通调度类任务抢占走。
通过策略优化,实现内部测试模型(应用连续启动),用户感知任务访问睡眠锁发生竞争降低30%(竞争次数/访问次数)大数据统计前台应用连续丢帧改善10%+。

等锁期排队优化策略

谢柳杰对于等锁排队优化提出了两个设计点:
设计点1 对乐观自旋行为进行限制
1)普通任务自旋时间减少,用户感知任务自旋时间增加
2)等待链表存在用户感知任务,关闭乐观自旋
设计点2 用户感知任务进行插队
1)用户感知任务进入慢速路径时,插在非感知任务之前
2)避免对设置hand-off标志位的任务进行插队
3)读写类型的锁场景中,以reader身份访问时不进行插队

此外,谢柳杰也分享了内核锁团队在其它方向上的探索,如基于任务优先度排序及针对自旋锁的大核优先排序,内部构造的测试模型表现良好,但由于缺乏实际手机应用场景,没有真正使用起来。

结语

此外,本次大会OPPO还公布了可编程内核技术方向,作为 OPPO 面向未来的技术,可编程内核是对底层技术的重大改造,这或将极大程度提升虚拟机运行效率,从底层解决安卓卡顿问题,引领安卓流畅体验细节比拼。未来ColorOS会持续在可编程内核上演进,聚焦可编程调度器、可编程内存管理、可编程IO调度、可编程同步机制等领域,针对每个手机场景做到极致的优化,流畅性非常值得期待。
总的来说,ColorOS十年发展以来,在每一代的更新上都有着亮眼的性能表现提升,如今全新的可编程内核技术,更是ColorOS十周年积淀下来的成果,相信未来在该新技术的加持下,ColorOS在移动场景的流畅性上会给我们带来更大的惊喜,全新的用户体验值得期待!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CSDN资讯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值