Linux内核死锁(deadlock)检测

本文介绍了一种在Linux系统发生内核死锁时的有效检测方法。通过配置特定的内核选项,可以在系统僵死前打印出相关的信息,从而帮助定位故障原因。文章还提供了一个具体的实例,展示了如何在SLES11.1系统中检测到内核死锁并打印相关信息。

转载地址:http://ilinuxkernel.com/?p=537

业务运行过程中,Linux系统僵死,屏幕无任何有效打印信息,网络中断、键盘鼠标没有任何响应。这种故障现象,可能是因为Linux内核死锁导致。由于无任何有效打印信息,内核日志中也没有记录,就无法定位故障根因。

 


如何让Linux内核在僵死前打印相关信息,对问题定位尤为关键。其中一个有效手段是打开“Kernel Hacking”选项,然后重新编译内核。

对于Linux内核死锁有帮助的几个配置选项有:

[*] Detect Soft Lockups


[ ] Panic (Reboot) On Soft Lockups

[*] Detect Hung Tasks

(120) Default timeout for hung task detection (in seconds)


[*] Panic (Reboot) On Hung Tasks

[ ] Lock usage statistics 

[ ] Spinlock debugging: sleep-inside-spinlock checking

 

 


下面一个实例是在SLES11.1 2.6.32.12-0.7内核中系统僵死前,检测到内核死锁并panic,打印出了死锁进程和信息。

ftp           D ffff88010d7c5978  4472 22481   4259 0×00000000

 ffff880031d1dd08 0000000000000016 ffff8801025cf6f8 0000000000000005

 ffff880031d1dc08 ffff880031d1dfd8 000000000000ca98 00000000001d1580

 0000000000004000 00000000001d1580 ffff880031d1dca8 ffffffff8108970c

Call Trace:

 [<ffffffff8108970c>] ? __lock_acquire+0xf7f/0×1038

 [<ffffffff81076ca2>] ? sched_clock_cpu+0x9a/0×183

 [<ffffffff810859e9>] ? mark_held_locks+0x6e/0xa3

 [<ffffffff8184df73>] ? mutex_lock_nested+0x2cf/0x4ff

 [<ffffffff8184df89>] mutex_lock_nested+0x2e5/0x4ff

 [<ffffffff810b1d6c>] ? generic_file_aio_write+0×62/0xea

 [<ffffffff810b1d6c>] ? generic_file_aio_write+0×62/0xea

 [<ffffffff810b1d6c>] generic_file_aio_write+0×62/0xea

 [<ffffffff810f93b2>] do_sync_write+0xee/0×157

 [<ffffffff810704ca>] ? autoremove_wake_function+0×0/0x4d

 [<ffffffff810fa23d>] vfs_write+0xed/0x1d1

 [<ffffffff810fa43e>] sys_write+0x5c/0x9f

 [<ffffffff8100376b>] system_call_fastpath+0×16/0x1b

1 lock held by ftp/22481:

 #0:  (&sb->s_type->i_mutex_key#5){+.+.+.}, at: [<ffffffff810b1d6c>] generic_file_aio_write+0×62/0xea

Kernel panic – not syncing: hung_task: blocked tasks

Pid: 536, comm: khungtaskd Not tainted 2.6.32.120609_new #14

Call Trace:

 [<ffffffff8184a9b4>] panic+0x9f/0×228

 [<ffffffff810a2b59>] watchdog+0x33c/0x3a2

 [<ffffffff810a293d>] ? watchdog+0×120/0x3a2

 [<ffffffff810a281d>] ? watchdog+0×0/0x3a2

 [<ffffffff81070177>] kthread+0xa0/0xaf

 [<ffffffff8100477a>] child_rip+0xa/0×20

 [<ffffffff81048bbd>] ? finish_task_switch+0×0/0xfe

 [<ffffffff8100413c>] ? restore_args+0×0/0×30

 [<ffffffff8107001c>] ? kthreadd+0xc0/0x17b

 [<ffffffff810700d7>] ? kthread+0×0/0xaf

 [<ffffffff81004770>] ? child_rip+0×0/0×20


Linux 内核中,**Oops、Deadlock、OOM** 是三种常见且严重的错误类型,它们分别代表不同的系统异常状态,分析这些错误对于调试系统问题、提升系统稳定性至关重要。 ### Oops 错误 Oops 是 Linux 内核中的一种错误报告机制,通常发生在内核执行过程中遇到了非法操作或访问了非法地址。它并不一定会导致系统崩溃,但通常意味着内核出现了某种逻辑错误。当 Oops 发生时,内核会打印出当前的寄存器状态、堆栈信息、调用链等,以便开发者进行分析。 Oops 通常由以下原因引发: - 访问空指针或非法地址 - 内核模块错误 - 驱动程序 bug - 件访问错误 内核在 Oops 时会尝试继续运行,但如果错误严重,可能会导致系统进入不可恢复状态(如 panic)[^1]。 ### Deadlock死锁死锁是指两个或多个进程(或线程)因争夺资源而陷入相互等待的状态,导致程序无法继续执行。Linux 内核死锁的常见原因包括: - 多个线程以不同的顺序获取锁 - 自旋锁或互斥锁使用不当 - 中断上下文与进程上下文之间的锁竞争 死锁检测和分析通常依赖于代码审查、锁依赖分析工具(如 lockdep)以及日志追踪。内核提供了 lockdep 子系统来帮助开发者检测潜在的死锁问题。 示例:使用 `lockdep` 检测死锁: ```c #include <linux/lockdep.h> DEFINE_SPINLOCK(my_lock); ``` 启用 lockdep 后,内核会在死锁发生时输出详细的锁依赖关系链,帮助定位问题。 ### OOM(Out Of Memory) OOM 是指系统内存耗尽,无法继续分配内存的情况。Linux 内核通过 OOM Killer 机制来处理这种情况:当系统内存不足时,内核会选择一个或多个进程终止,以释放内存资源。 OOM 触发的常见原因包括: - 进程内存泄漏 - 内存分配请求过大 - 系统物理内存不足 OOM Killer 会根据 `oom_score` 来选择要终止的进程,`oom_score_adj` 可用于调整进程被选中的优先级。 内核日志中通常会记录 OOM 事件,例如: ``` Out of memory: Kill process 1234 (my_process) score 900 or sacrifice child ``` 可以通过 `/proc/<pid>/oom_score` 查看进程的 OOM 分数,分数越高越容易被杀死。 ### 错误分析工具与方法 - **Oops 分析**: - 查看 Oops 日志中的堆栈信息 - 使用 `kprobe` 或 `ftrace` 进行动态追踪 - 利用 `crash` 工具分析内核崩溃转储文件 - **Deadlock 分析**: - 使用 `lockdep` 检测锁依赖 - 分析 `/proc/lockdep` 和 `/proc/lockdep_stats` - 利用 `sysrq` 触发死锁信息输出 - **OOM 分析**: - 查看 `/var/log/messages` 或 `dmesg` 输出 - 分析 `/proc/meminfo` 和 `/proc/<pid>/status` - 使用 `oom_score_adj` 控制 OOM Killer 的行为
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值