linux死锁检测与调试

什么是死锁?

  死锁是指多个进程(线程)因为长久等待已被其他进程占有的的资源而陷入阻塞的一种状态。当等待的资源一直得不到释放,死锁会一直持续下去。死锁一旦发生,程序本身是解决不了的,只能依靠外部力量使得程序恢复运行,例如重启,开门狗复位等。
  

D 状态死锁和 R 状态死锁

Linux 提供了检测死锁的机制,主要分为 D 状态死锁和 R 状态死锁。

  • D 状态死锁
    进程等待 I/O 资源无法得到满足,长时间(系统默认配置 120 秒)处于 TASK_UNINTERRUPTIBLE 睡眠状态,这种状态下进程不响应异步信号(包括 kill -9)。如:进程与外设硬件的交互(如 read),通常使用这种状态来保证进程与设备的交互过程不被打断,否则设备可能处于不可控的状态。对于这种死锁的检测 Linux 提供的是 hung task 机制。触发该问题成因比较复杂多样,可能因为 synchronized_irq、mutex lock、内存不足等。D 状态死锁只是局部多进程间互锁,一般来说只是 hang 机、冻屏,机器某些功能没法使用,但不会导致没喂狗而系统死机。

  • R 状态死锁
    进程长时间(系统默认配置 60 秒)处于 TASK_RUNNING 状态垄断 CPU 而不发生切换,一般情况下是进程关抢占或关中断后长时候执行任务、死循环,此时往往会导致多 CPU 间互锁,整个系统无法正常调度,导致喂狗线程无法执行,无法喂狗而最终看门狗复位的重启。该问题多为原子操作,spinlock 等 CPU 间并发操作处理不当造成。本文所介绍的 Lockdep 死锁检测工具检测的死锁类型就是 R 状态死锁。

soft lockup 和 hard lockup?

soft lockup:抢占被长时间关闭而导致进程无法调度.
hard lockup : 中断被长时间关闭而导致更严重的问题.
后面会分析这种lockup的内核检测原理.

linux内核死锁如何调试?

linux内核于2006年引入内核lockdep 死锁检测模块(https://lwn.net/Articles/185666/)。

相关内核配置选项

  • CONFIG_PROVE_LOCKING
    This feature enables the kernel to report locking related deadlocks before they actually occur. For more details, see Documentation/locking/lockdep-design.txt.
  • CONFIG_DEBUG_LOCK_ALLOC
    Detect incorrect freeing of live locks.
  • CONFIG_DEBUG_LOCKDEP
    The lock dependency engine will do additional runtime checks to debug itself, at the price of more runtime overhead.
  • CONFIG_LOCK_STAT
    Lock usage statistics. For more details, see Documentation/locking/lockstat.txt
  • CONFIG_DEBUG_LOCKING_API_SELFTESTS
    The kernel to run a short self-test during bootup in start_kernel(). The self-test checks whether common types of locking bugs are detected by debugging mechanisms or not. For more details, see lib/locking-selftest.c

  • CONFIG_LOCKUP_DETECTOR

  • CONFIG_HARDLOCKUP_DETECTOR_OTHER_CPU

  • CONFIG_HARDLOCKUP_DETECTOR

Linux检测死锁实现分析

本节主要分析linux内核soft lockup 和 hard lockup检测原理.

soft lockup检测原理

首先,系统会为每个cpu core注册一个

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值