🐧内核:异常类型[转]

type
status
date
slug
summary
tags
category
icon
password
内容主要来自于 “Hello 小崔的Linux”知乎专栏第四章内容。

1. Linux 的几种异常

1.1. hungtask

现象:
内核打印 “INFO: task xxx:xxx blocked for more than 120 seconds.”
notion image
触发原因:
内核某进程 / 线程长期处于 D 状态,无法唤醒
说明:
  1. 必须是内核线程(用户态任务无法触发);但如果某用户态任务调度到内核态,内核态处理出现 D,会触发。
  1. 默认 hungtask 是不会 panic 和挂掉,内核只是会打印 hung 住的堆栈,因为内核无法判断 hung 住是主观故意为之还是异常,所以内核认为此异常不必须挂掉。
接口:
hungtask 默认开启,D 时间超过 120s 会打印,修改时间和关闭开启的接口
hung_task_panic------------------------ 是否在检测到 hung 后 panic,默认值 0
hung_task_check_count--------------- 最大检查 task 数量,默认值 32768
hung_task_timeout_secs-------------- 超时时间,默认值 120
hung_task_warnings-------------------- 打印 hung warning 的次数,默认值 10
hung_task_check_interval_secs ----------------------- 检测间隔,默认 0

1.2. panic

现象:
Kernel panic - not syncing
notion image
panic,英文意思即崩溃,linux 走到崩溃之际,将尽可能把它此时能获取的全部信息都打印出来。
触发原因:
内核崩溃,错误原因很多,比如页表异常、硬件不可恢复错误、空指针访问等等。

1.3. oom

现象:
内存溢出。
notion image
触发原因:
Linux 内核有个机制叫 OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽内核会把该进程杀掉,同时打印信息。
说明:
  1. OOM 默认不会挂掉,会尝试 kill 耗费资源的进程,如果 kill 后恢复,则系统正常。如果没恢复,会一直 kill;
  1. Kill 顺序首先根据 /proc/PID/oom_score_adj 设置优先级去 kill,同优先级基本先 kill 耗费内存最大的进程;
接口
设置进程 kill 优先级 /proc/PID/oom_score_adj(注意 points 越小越不容易被杀)

1.4. softlockup

现象:
打印 “[56.032356] NMI watchdog: BUG: soft lockup - CPU#0 stuck for 23s! [cat:153]“
notion image
说明:
softlockup 死锁,主要用于检测内核的进程调度是否正常,当发生 softlockup 时,内核不能被调度,
系统在每个 cpu 上创建一个内核线程,当 hrtimer 定期执行的回调后会尝试唤醒此线程,如果线程有被正常调度而被唤醒,
它会更新时间变量 watchdog_touch_ts,如果没有则不会更新。在 hrtimer 的回调函数中会判断 watchdog_touch_ts 和当前
时间差,如果超过给定值,那就证明内核调度失败,接着就打印异常 log。
接口
/proc/sys/kernel/nmi_watchdog-------------------------hard lockup 开关,/proc/sys/kernel/soft_watchdog------------------------soft lockup 开关,/proc/sys/kernel/watchdog-----------------------------watchdog 总开关,/proc/sys/kernel/watchdog_cpumask---------------------watchdog cpumaks,/proc/sys/kernel/watchdog_thresh----------------------watchdog 超时阈值设置

2. 系统调用

notion image
在系统中,大部分调用是经过 GLIBC 库,最终到内核是 sys_xxx 实现函数完成功能并返回。
探究方法是:
ldd xxxx.so
nm -D xxxx.so | grep SOME_FUNCTION

3. 异常与中断的关系

notion image

4. 总结

只有系统 panic 时,才会触发 kdump。实际使用中,经常遇到 OOM 或者系统挂死,重启后无 kdump 日志的情况,这是应为系统 hung 和 OOM 不会触发 panic,因此系统进入第二内核存储日志信息。
这种情况,可以配置系统异常后主动 panic,从而达到触发 kdump 目的,比如:
  • 配置 hungtask 后 panic:
在 linux 异常问题定位时,首先判断异常类型,根据异常触发原理推断异常触发原因,可以极大缩短问题范围。

5. 原文地址

  1. linux 的几种异常介绍 https://zhuanlan.zhihu.com/p/96855878
  1. linux 的系统调用执行探究 https://zhuanlan.zhihu.com/p/102732314
中年码农的困境log-001-我与计算机