万字解析Hungtask原理及分析(下)

接上文万字解析Hungtask原理及分析(上)

三、问题分析

上面介绍了两种hungtask检测的原理及方法,我们知道了不同系统可以如何判断task已经hang住,进而触发系统去显示或保存现场状态(如发现重要task持续hang住时,会多次打印D状态task的栈信息、或系统最终因为hungtask无法恢复而重启时保存ramdump)及异常恢复。

一般可以通过kernel log中的task栈信息打印,看到hang住的关键task及其对应的栈,并对比相隔一定时间的多次该task的栈情况,明确该task确实已经异常,之后就可以根据栈的情况推测及寻找线索。如果开启了ramdump,异常重启时保存的ramdump也会对问题分析产生很大的帮助。

实际遇到的大多数问题,通过log中的task栈信息,一般只能粗略知道task hang住的大致现场及方向,还需要结合log中的其他信息、ramdump等进行分析,可能还需要判断问题发生场景、编译调试版本复现问题抓取更多信息,或者排查可疑修改。

由hungtask原理可知,产生hungtask异常的直接原因是所关注的task长时间处于D状态或无法调度运行,一般就是task本身有异常或系统有异常影响到了该task。以系统异常的情况居多,常见的可能原因有内存不足、内存分配异常、UFS器件异常、文件系统异常、spinlock或rwsem等各种锁死锁、中断风暴等等;task本身的异常,可能是其本身逻辑问题,需要具体分析。针对每种原因,大都有对应的判断及定位方法,可以输出相应的调试版本压测复现分析。

以下举两个实际的例子看下hungtask问题发生的现象及分析方法。

1、开关机测试时死机

在开关机测试及各项功能测试时均出现了低概率死机问题,由于故障机分散,判断为非硬件个体问题。查看故障机kernel log,发现死机之前,有hungtask打印。下面是其中一例死机前输出的hungtask情况。

hungtask检测输出的hang住的其中几个task的栈情况如下,该例中init进程阻塞在了io上。

分析多例故障现场,hang住的task不一致,用T32分析对应的ramdump,task会卡在对不同文件的io操作;出问题时hang住的task数量均较多。

 资料直通车:Linux内核源码技术学习路线+视频教程内核源码

学习直通车:Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈

解析ramdump得到cpu上的任务队列情况,

发现一个swr irq(音频功放注册的中断)在运行,一个swr irq在pending,还有多个cfs task也在pending。查看系统中断状态,观察到开机的短时间内,产生了大量中断,引起中断风暴,可能会严重影响系统中其他任务的执行,包括io操作,由此导致比较随机的开机时不同任务卡io的问题的发生。

之后去掉该音频功放注册的中断(实际上这个中断对应的音频功放并没有使用,中断引脚输入状态不定导致随机的中断异常),进行开关机压测,没有复现问题。

2、Monkey测试时死机

某项目发现低概率hungtask问题,过一段时间就会有一、两例出现,在Money测试中概率有所上升,每轮中能稳定出现一到两例。每次出现问题的task不一定相同。下面举一个例子:

这里时surfaceflinger出现了hungtask情况,其一直在尝试获取 kworker/u16:14 进程所持的mutex。再查看kworker/u16:14,

可以看到该task在等rpm(处理系统中时钟和电源请求的子系统)操作的completion,但这里rpm ack一直没有返回。查看其它异常时现场,共性都是rpm ack一直没有返回。最后分析到,虽然系统还有足够的H memory(HighAtomic),但ap和rpm通信用的glink分配内存时无法使用这种迁移类型的memory;系统同时有许多zs_malloc失败的情况,因为zram功能本身在进行内存分配时,也没有使用H memory,从而导致anon page回收异常。

最后,调整内存回收参数,该问题得以优化。

四、总结

本文主要描述了什么是hungtask、hungtask检测方法以及hungtask产生的原因,并通过两个案例,展示了具体问题分析方法。

hungtask表现为某些重要进程一直不能运行,如长期处于uninterruptible sleep状态(也就是常说的D状态。可以采取多种方法检测:定时轮询系统中的所有task,然后判断处于D状态的task的上下文切换次数是否和之前轮询时的相等,如果相等则表明该task两个轮询间隔期间一直处于D状态,可以认为该task有hang的情况;或只关注重要进程的运行情况,让这个重要进程在规定时间内模拟喂狗操作,若发现没有及时喂狗,则认为其有hang的情况。产生hungtask的直接原因是所关注的task长时间处于D状态或无法调度运行,task本身有异常或系统有异常影响到了该task:对于系统异常,常见的可能原因有内存不足、内存分配异常、UFS器件异常、文件系统异常、spinlock或rwsem等各种锁死锁、中断风暴等等;task本身的异常,为其本身逻辑问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值