当前位置: 首页 > article >正文

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

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

在 Linux 系统中,可以使用多种方法来检测进程是否发生死锁(Deadlock)。


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

可以使用 ps 命令查看进程状态:

ps -eo pid,lwp,stat,wchan:30,cmd | grep <进程名或PID>

关键字段:

  • STAT(状态):
    • D:不可中断睡眠(通常是 I/O 问题)
    • R:运行态
    • S:可中断睡眠
    • T:暂停(可能被 SIGSTOP 信号暂停)
  • WCHAN(等待通道):如果多个线程在同一个 WCHAN 挂起,可能是死锁。

如果怀疑死锁,可以使用 strace 附加到进程,查看系统调用是否卡住:

strace -p <PID>

如果进程一直停留在 futexsem_waitpthread_mutex_lock,可能是线程死锁。


2. 使用 lsof 检查资源锁定

lsof 可以检查进程打开的文件或锁定的资源:

lsof -p <PID>

如果多个进程/线程对相同资源(如文件或 socket)持有锁,并且都在等待,可能是死锁。

如果要检查进程是否因文件锁(flock/fcntl)死锁:

lsof | grep -i "locked"

3. 使用 pstackgdb 查看线程栈

如果是多线程程序,使用 pstackgdb 查看线程堆栈:

pstack <PID>

或使用 gdb

gdb -p <PID>
(gdb) thread apply all bt

如果多个线程都卡在 pthread_mutex_lock,可能是死锁。


4. 使用 proc 文件系统检查 futex

如果怀疑进程死锁在 futex(用户态线程锁),可以检查 /proc/<PID>/stack

cat /proc/<PID>/stack

如果多个线程都在 futex_wait_queue_me,可能是死锁。


5. 使用 perf 观察锁争用

如果怀疑死锁涉及锁争用,可以使用 perf

perf record -g -p <PID>
perf report

查看 pthread_mutex_lockfutex_wait 是否高频出现。


6. 使用 lockstat 监测锁争用

如果是内核级死锁,可以使用 lockstat(部分发行版需要开启 CONFIG_LOCK_STAT):

echo 1 > /proc/sys/kernel/lock_stat
cat /proc/lock_stat

7. 使用 dmesg 观察内核死锁

某些情况下,内核可能会检测到死锁并输出警告:

dmesg | grep -i deadlock

如果有相关信息,说明系统可能存在死锁。


总结

  • ps, strace 用于分析进程状态和系统调用卡住的位置。
  • lsof 用于检查文件或资源锁。
  • pstack, gdb 用于分析线程堆栈,判断是否多个线程卡在锁等待上。
  • proc 文件系统(/proc/<PID>/stack)可用于检查 futex 死锁。
  • perf, lockstat 用于更深入分析锁争用情况。
  • dmesg 可用于检查内核是否检测到死锁。

你可以结合这些方法,具体看进程是否真的发生了死锁。


http://www.kler.cn/a/612463.html

相关文章:

  • Python----计算机视觉处理(Opencv:模板匹配)
  • leetcode_704. 二分查找_java
  • 1字节(8位)表示8个状态位
  • spring @Autowired对属性、set方法,构造器的分别使用,以及配合 @Autowired 和 @Qualifier避免歧义性的综合使用案例
  • 通过 ECNWP 洋流、海浪可视化开发的方法和架构
  • 【NLP 48、大语言模型的神秘力量 —— ICL:in context learning】
  • Windows10清理机器大全集
  • 软件功能性测试工具有哪些?专业软件测试服务推荐
  • Linux下EC11旋转编码器驱动调试
  • 16、Python继承与多态机制深度解析
  • 【linux指令】一文掌握 Linux 基础命令(Linux 命令速查)
  • STM32F103_LL库+寄存器学习笔记07 - 串口接收缓冲区非空中断
  • 一文速通Python并行计算:01 Python多线程编程-基本概念、切换流程、GIL锁机制和生产者与消费者模型
  • C++11大数加减
  • MyBatis-Plus LambdaQueryWrapper 详解:优雅构建类型安全的查询条件
  • Python Web 框架 Django、Flask 和 FastAPI 对比
  • 5G核心网(5GC)开户中,DNN(Data Network Name,数据网络名称)
  • 【Android】SharedMemory获取文件描述符
  • 【Python】天气数据可视化
  • Hyperlane 似乎是一个轻量级、高性能的 Rust HTTP 服务器库