Linux 体系检测进程死锁的方法

打印 上一主题 下一主题

主题 1511|帖子 1511|积分 4533

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Linux 体系检测进程死锁的方法

在 Linux 体系中,可以利用多种方法来检测进程是否发存亡锁(Deadlock)。

1. 利用 ps + strace 观察进程状态

可以利用 ps 下令检察进程状态:
  1. ps -eo pid,lwp,stat,wchan:30,cmd | grep <进程名或PID>
复制代码
关键字段:


  • STAT(状态):

    • D:不可中断睡眠(通常是 I/O 问题)
    • R:运行态
    • S:可中断睡眠
    • T:暂停(大概被 SIGSTOP 信号暂停)

  • WCHAN(等候通道):假如多个线程在同一个 WCHAN 挂起,大概是死锁。
假如猜疑死锁,可以利用 strace 附加到进程,检察体系调用是否卡住:
  1. strace -p <PID>
复制代码
假如进程不绝停顿在 futex、sem_wait、pthread_mutex_lock,大概是线程死锁。

2. 利用 lsof 查抄资源锁定

lsof 可以查抄进程打开的文件或锁定的资源:
  1. lsof -p <PID>
复制代码
假如多个进程/线程对雷同资源(如文件或 socket)持有锁,而且都在等候,大概是死锁。
假如要查抄进程是否因文件锁(flock/fcntl)死锁:
  1. lsof | grep -i "locked"
复制代码

3. 利用 pstack 或 gdb 检察线程栈

假如是多线程程序,利用 pstack 或 gdb 检察线程堆栈:
  1. pstack <PID>
复制代码
或利用 gdb:
  1. gdb -p <PID>
  2. (gdb) thread apply all bt
复制代码
假如多个线程都卡在 pthread_mutex_lock,大概是死锁。

4. 利用 proc 文件体系查抄 futex

假如猜疑进程死锁在 futex(用户态线程锁),可以查抄 /proc/<ID>/stack:
  1. cat /proc/<PID>/stack
复制代码
假如多个线程都在 futex_wait_queue_me,大概是死锁。

5. 利用 perf 观察锁争用

假如猜疑死锁涉及锁争用,可以利用 perf:
  1. perf record -g -p <PID>
  2. perf report
复制代码
检察 pthread_mutex_lock 或 futex_wait 是否高频出现。

6. 利用 lockstat 监测锁争用

假如是内核级死锁,可以利用 lockstat(部门发行版需要开启 CONFIG_LOCK_STAT):
  1. echo 1 > /proc/sys/kernel/lock_stat
  2. cat /proc/lock_stat
复制代码

7. 利用 dmesg 观察内核死锁

某些情况下,内核大概会检测到死锁并输出警告:
  1. dmesg | grep -i deadlock
复制代码
假如有干系信息,说明体系大概存在死锁。

总结



  • ps, strace 用于分析进程状态和体系调用卡住的位置。
  • lsof 用于查抄文件或资源锁。
  • pstack, gdb 用于分析线程堆栈,判定是否多个线程卡在锁等候上。
  • proc 文件体系(/proc/<ID>/stack)可用于查抄 futex 死锁。
  • perf, lockstat 用于更深入分析锁争用情况。
  • dmesg 可用于查抄内核是否检测到死锁。
你可以结合这些方法,具体看进程是否真的发生了死锁。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张国伟

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表