2022云栖精选—手机内核稳定性的治理与实践

简介: 白浩文魅族手机 高级工程师

lQLPJxbcF2cqNBvMiM0FeLCMz4ifcSGHeANpqgFLAEAA_1400_136.png

智能手机发展了近十年,魅族手机是最早建立起稳定性体系和标准的终端厂商之一。

image.png

系统需求金字塔的由下至上分别是功能可用、功能完整、稳定无故障、高可维护性、性能优越。

image.png

稳定性问题的来源多样化,大多可以总结为工艺问题、硬件问题、芯片原厂问题、上游社区问题以及终端厂商问题。内核稳定性问题主要包括宕机/死机以及异常重启。

image.png

稳定性工作包含designDevelopmentTestRelease以及Feedback5个流程。

我们会从大数据筛选出用户使用过程中的稳定性问题,不断迭代系统,让系统更加稳定。

  稳定性开发的目的在于通过提前干预的方法,让更多 bug 在开发阶段暴露出来,提高量产固件的稳定性,减轻后续维护压力,也提升用户体验。稳定性开发的内容包括代码静态分析(Static analysis)、动态故障检测(Dynamic check)、故障现场记录(Record fault)以及故障分析工具(Fault analysis tool)

image.png

代码静态分析的目的在于通过提前干预的方法,让更多 bug 在开发阶段暴露出来,提高量产固件的稳定性,减轻后续维护压力。过程中使用到的开源工具包括Section Mismatch检测、SmatchSparseCoccicheck,商业工具包括KlocworkFortifyPc-lint

image.png

运行时动态监测包括死锁检测、内核组件 warm bug 的注入)以及内存踩踏的检查。

image.png

Lockdep是内核原生自带的检查锁的工具,全方位检查spinlock, mutex, rwlock, rcu 的锁使用场景和方法是否引起死锁风险

image.png

比如系统发生lrq storm会卡住调度,卡住调度又会引发一连串的问题,而这些发散的问题很难往前追溯原因。最合适的方法是在 report bad lrq进行拦截,直接终止系统的运行。

另外,关键的warn还包括:

  • smp_processor_id() used in preemptable:在获取到 cpu id 到使用cpuid 的过程中,进程可能发生迁移从一个 cpu 迁移到另一个 cpu,这可能导致 cpu id 不准确,进而导致后续代码逻辑执行错误。如smp_processor_id()没有禁止调度,则可能出现风险,除非smp_processor_id()用在已经绑定了某个CPU的进程上。对于该 WARN,我们直接将其变为 BUG() 避免后续问题发散的风险。
  • schedule in atomic:在原子上下文中,不允许系统调度,否则会WARN
  • sleep in atomic:如果它所在函数处于原子上下文(atomic context)(如,spinlock, irq-handler…),调用可能引起睡眠的函数如 mutex_lockwait_for_completion等,会报 WARN sleep 意味着调度出去。
  • Bad irq warning:如果出现没有注册 specific handler,或没有正确返回 IRQ_HANDLED,或 100000个中断有 99900 没处理等共享中断问题,会触发 bad irq WARN,需要及早拦截。
  • spinlock debug warning:使用未初始化spinlock、重复上锁、重复解锁、wrong owner解锁等情况,spinlock 会报 WARN,如果不及时处理,可能会破坏锁结构体,埋下隐患。
  • Mutex debug warning :同上。
  • Workqueue warning:执行 work 时,不能留锁不释放,不能关中断、关抢占,否则会报 WARNwork 执行 timeout 时,可能卡住,也会报WARN

image.png

踩内存问题难以分析,很大原因在于抓取到的并不是第一现场。如上图,S为程序开始的节点,A为内存异常的第一现场,B才是我们抓取到的现场,分析问题的关键在于如何从B往前推导到A

踩内存的类型大致分为内存越界(out-of-bounds)、访问已经释放的内存(use-after-free)和飞踩等。检测手段也较为丰富,包括:

  • 局部变量踩内存检测:stack protector
  • 基于 page 的踩内存检测:page poisoning(滞后被动)
  • 基于 slub 的踩内存检测:slub debugmeizu slub debug enhance(滞后被动)
  • 全局第一现场踩内存检测(最优手段):KASAN(高开销)、MTEAMR V8.5 以上)、kfence(低开销、粒度大: page,采样率低)、MMU protect buddy/slab
  • 固定地址踩内存检测:watchpoint

魅族此前曾采用MMU protect buddy/slabbuddy没有分配出的页面设置为 MMU 不可访问。一旦访问读写则会报错,增加了很多不可访问的黑洞来提高抓取到第一现场的概率。

 

固定地址踩内存的检查image.png

魅族的踩内存问题检测手段Meizu slub debug enhance原理如下:将object size-alloc size填充为Red zone,在freecheck_objects,检查object size-alloc size是否全为red zone,以确认内存是否曾被踩踏。

image.png

龙蜥社区Anolis kfence enhance的原理为:在datapage的两边加上了fencepage电子栅栏,利用MMU的特性将fencepage设置为不可访问。如果对datapage的访问越过了page边界,则会立刻触发异常。

另外,龙蜥社区实现了动态开关全量检查,性能更优于Linux社区。

原生代码无法很好地提供分析材料,魅族需要自己支持更丰富和完善的手段来 debug,包括通过组合键触发 sysrq 捕获问题场景提供 reset_reason 节点信息提供重启前日志/sys/fs/pstore/console-ramoops-0用户不可刷除日志记录 rstinfoKernel 异常重启 ouc 上报Lmk 等关键位置 log 增强

分析 dump 会使用到的工具有Ramdump parserTrace32 simulatorCrash

image.png

MEIZU BSP云平台能够自动化分析 dump 并且输出总结性报告,可以在网页上直接查看和分析log。魅族内部的产线端、用户反馈端测试端统一接入了该平台开发人员可以很方便地使用可在前端专注分析报告日志来提高整体的分析效率。

智能日志分析系统可以接入Stability / Battery / recovery / android reboot / power 等模块

image.png

稳定性测试包括功能性测试和压力测试

image.png

上图为我们对稳定性问题的归纳。

image.png

内存问题也是常见的稳定性问题。我们也对其进行了总结归纳并列出了对应的解决方案。

image.png

治理稳定性问题的过程中,我们遇到了几个较大挑战。

第一,软件低概率问题测试和复现。特殊场景比如打开了某个开关或多个条件才能触发的问题,这要求我们具备搭建复现模型的能力,能够快速构建复现模型。我们期望能够通过黑盒、白盒提供更多的主动检查工具,将代码覆盖度测试得更充分。

第二,内存故障问题的定位比如MTE硬件检测无法使用,没有低消耗的第一现场检查手段;同soc里不同cpu踩内存(异构核踩内存(GPU/SensorHub/aopAP处理器共享内存场景);厂商提供了没有源码的二进制软件;工艺不良带来的虚埠等硬件不良筛查。

第三,卡死问题的定位。比如进程间死锁、CPU间死锁、资源耗尽、显示模块出现故障等。我们认为需要构建自动分析模型库来解决此类问题。


关于龙蜥峰会 eBPF & Linux 稳定性专场课件获取方式:


【PPT 课件获取】:关注微信公众号(OpenAnolis),回复“龙蜥课件” 即可获取。有任何疑问请随时咨询龙蜥助手—小龙(微信:openanolis_assis)。


【视频回放】:视频回放可前往龙蜥官网https://openanolis.cn/video 查看。

lQLPJxbcF2cqM2TM-M0CnrCgW_7LDpyh1wNpqgFKAPsA_670_248.png


相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
相关文章
|
6天前
|
前端开发 安全 开发者
【通义灵码实践】实现经典手机游戏推箱子
本文介绍了使用通义灵码辅助实现经典推箱子游戏的过程。首先,通过输入“用Python写一个推箱子游戏”,灵码生成了基本的终端版本代码,包括地图渲染、玩家移动和胜利检测等功能。然而,终端版本交互体验不佳。为了解决这一问题,再次输入“不要在终端上运行,希望可以在页面上运行”,灵码生成了基于Flask的后端代码和HTML前端代码,实现了网页版推箱子游戏。最终结果展示了游戏的完整实现,包括前后端交互和用户界面。总结中提到,该方法具有快速生成代码、代码质量高、易于扩展等优点,但也存在功能简单、样式和用户体验有限、错误处理不足等问题,适合快速原型开发和教学演示。
39 2
|
3月前
|
存储 移动开发 JavaScript
html5手机Web单页应用实践--起点移动阅读
html5手机Web单页应用实践--起点移动阅读
|
5月前
易优cms内核简洁文章资讯作文范文网站模板源码(带手机版)
易优cms内核简洁文章资讯作文范文网站模板源码(带手机版)
39 10
|
4月前
|
Web App开发 编解码
软件开发常见流程之兼容性和手机屏页面设计,PC端和移动端常见浏览器,国内的UC都是根据Webkit修改过来的内核,开发重点关注尺寸,常见移动端尺寸汇总,移动端,理想视口根据你设别的样式进行修改
软件开发常见流程之兼容性和手机屏页面设计,PC端和移动端常见浏览器,国内的UC都是根据Webkit修改过来的内核,开发重点关注尺寸,常见移动端尺寸汇总,移动端,理想视口根据你设别的样式进行修改
|
6月前
|
编解码 监控 定位技术
抖音技术分享:抖音Android端手机功耗问题的全面分析和详细优化实践
本文结合抖音的功耗优化实践中产出了一些实验结论,优化思路,从功耗的基础知识,功耗组成,功耗分析,功耗优化等几个方面,对 Android 应用的功耗优化做一个总结沉淀。
347 0
网狐荣耀手机端内核源码
网狐荣耀手机端内核源码
327 0
|
存储 缓存 负载均衡
vivo手机上的系统级消息推送平台的架构设计实践
本文将要分享的是手机厂商vivo的系统级推送平台在架构设计上的技术实践和总结。这也是目前为止首次由手机厂商分享的自建系统级推送平台的技术细节,我们也得以借此机会一窥厂商ROOM级推送通道的技术水准。
368 0
vivo手机上的系统级消息推送平台的架构设计实践
|
Web App开发 安全 数据可视化
浅析手机抓包方法实践(zt)
浅析手机抓包方法实践(zt)
343 0
|
运维 监控 前端开发
Qcon演讲实录|手机淘宝客户端的攻防演练实践
混沌工程是一个业界比较流行的防范系统性风险的方法论, 其核心思想是通过不断地失败来避免失败,以主动制造故障的方法来宏观地验证业务的容灾和恢复能力。这一概念在服务端存在大量的实践和落地, 在客户端还是属于探索阶段,业界甚少甚至没有类似尝试。手机淘宝等大型应用其实是一个广义概念上的分布式系统, 混沌工程理念是否也可以在这类型广义分布式系统上产生价值呢?答案是肯定的,本次分享将向大家介绍手机淘宝客户端是如何使用攻防演练来降低客户端系统风险、提高快速交付能力的。
|
消息中间件 缓存 前端开发
手机淘宝轻店业务 Serverless 研发模式升级实践
我们在探索Serverless一体化研发模式的最佳提效实践。
手机淘宝轻店业务 Serverless 研发模式升级实践
下一篇
无影云桌面