Linux内核故障分类和排查

设备故障分为多种表现形式,可以把它分为3类:
1.系统崩溃重启(panic)
2.系统出现长时间无响应异常(hung)
3.系统出现短暂卡顿(性能问题)

针对第1类,一般引起的原因包括:软件bug、死锁(soft lockup、hard lockup)、指令异常abort、system error(SError)。

(1)软件bug:指的时在代码上检测到运行到异常逻辑后调用BUG宏,从而产生oops,如果内核配置了panic_on_oops,那么就会触发panic。

(2)soft lockup:指的是在一个CPU上运行的内核路径超过20s,其他进程都无法在该CPU上得到调度,典型的场景就是spinlock死锁,spinlock会禁止该CPU上的调度,因此在等待spinlock时发生死锁是会触发soft lockup的。

CONFIG_LOCKUP_DETECTOR=y
CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=y
CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=1

(3)hard lockup:死锁的另一种类型,hard lockup指的是在一个CPU上超过10s时间无法处理中断,内核异常关闭中断超过10s就会触发hard lockup,比如调用spin_lock_irq之后死锁。检测并触发这种故障类型需要硬件支持,仅仅在一些平台上支持。(CONFIG_HARDLOCKUP_DETECTOR)

(4)指令异常:ARM64一般指的是3大异常(undefine instruction、data abort、prefetch instruction abort),指令运行时发生异常会触发处理器进入对应的异常模式,并且执行异常处理函数,最终调用abort(),打印栈信息,执行panic。比较常见的就是在内核中访问一个NULL指针,或者写入一个只读的地址,这些都会触发data abort。

(5)SError:属于硬件级别的异常,除了system error,还有soc error、hardware error等等。

对应的故障场景举例说明:

spinlock死锁      -- soft lockup
异常长时间关闭中断  -- hard lockup
访问空地址         -- data abort
写入只读地址       -- data abort
内存越界访问       -- data abort
栈溢出            -- data abort

针对第2类,系统hung住,表示主要服务进程卡住,却不会导致系统crash,出现这个现象的原因包括:读写锁(rw_semaphore)和互斥锁(mutex)。

hung的含义是指进程长时间处于不可中断的睡眠状态(D状态),此时该进程是不对异步信号做响应的,因此我们无法利用kill杀死它,一般是由于一个进程持有了可睡眠锁却无法获得或者长时间等待硬件无响应的状态。在内核中可以通过配置如下debug选项来对系统hung住的情况进行检测:

CONFIG_DETECT_HUNG_TASK=y
CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120
CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y
CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=1

以上配置的情况会在一个进程进入D状态时间超过120秒后,打印出对应的stack trace信息。如果配置了 CONFIG_BOOTPARAM_HUNG_TASK_PANIC 那么会更进一步使得内核直接panic,此时系统表现就不是hung住了,而是系统崩溃重启。假如没有使能Panic特性,那么系统hung住的问题将会变得很难定位,一般手机厂商在系统hung住时,假如系统没有自动进入panic,那么可以手动触发一个crash,抓出手机中的ramdump进行分析。查找故障现场的task信息,寻找对应的D状态的进程,并找出该进程的栈回溯,然后找到问题所在。

针对第3类,系统出现短暂卡顿,这实际上属于性能问题,而不是故障问题了。

对于性能问题,卡顿的出现是什么原因,可能也是系统中的负载过重,或者很多进程在等待硬件,也就是处于不可中断的睡眠状态(D状态)。可以利用top、iostat、mpstat、ps、ftrace、perf等等工具进行进一步的定位。


参考:
https://blog.csdn.net/u010385454/article/details/53018420
https://blog.csdn.net/chinalinuxzend/article/details/4288784

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值