Linux内核死锁(deadlock)检测

转载地址: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


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Ubuntu内核中,死锁是指当多个线程或进程同时持有资源,并且互相等待对方释放资源时发生的一种情况。死锁通常是由于资源分配的顺序不当或者互斥锁的使用不正确引起的。当死锁发生时,系统的进程或线程将无法继续执行,导致系统无响应。 在Linux内核中,为了避免死锁的发生,使用了自旋锁和非自旋锁(如semaphore或mutex)两种锁机制。自旋锁是一种忙等待的锁,当一个线程无法获取锁时,它会一直在一个循环中自旋等待,直到获取到锁为止。而非自旋锁在获取不到锁的时候会进入阻塞状态,从而进入内核态。然而,使用非自旋锁会导致线程从用户态和内核态之间频繁切换,影响锁的性能。 因此,在Ubuntu内核中,为了避免死锁并提高锁的性能,可以考虑使用自旋锁来保护共享数据。自旋锁适合用于只有进程上下文访问的场景,而在同时涉及中断上下文和进程上下文的场景下,则需要谨慎选择适当的锁机制,以避免死锁的发生。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Linux驱动之 内核最常见的自旋锁及死锁示例](https://blog.csdn.net/qq_52858062/article/details/116397144)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Linux内核 自旋锁spin lock,教你如何用自旋锁让ubuntu死锁](https://blog.csdn.net/daocaokafei/article/details/108266526)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值