排查soft lockup最直接的入口,非dmesg莫属。执行dmesg | grep -i "soft lockup",能快速定位日志;而dmesg -T | grep -A5 -B2 "soft lockup",则可显示带时间戳和Call Trace的上下文。这里面的关键字段包括CPU编号、卡住线程名(像[kworker/1:2])以及调用栈起点。

Linux如何查看具体的内核运行中产生的软锁定及死锁调试报告

直接看 dmesg 里的 soft lockup 报告

软锁定(soft lockup)触发后,内核会立即往 ring buffer 写入带时间戳和调用栈的日志,dmesg 是最直接的入口。别等系统卡死再查,只要出现过,它就还在缓冲区里:

注意:默认 dmesg 缓冲区可能被新日志覆盖,高频软锁时建议搭配 journalctl -k -f 实时监听内核日志流。

启用 lockdep 后看 /proc/lockdep_chains

lockdep 不是“事后分析”,而是运行时动态建模锁依赖关系。它只在配置了 CONFIG_PROVE_LOCKING=y 的内核中生效,且需手动开启:

⚠️ 生产环境慎开:lockdep 会显著增加锁操作开销,可能掩盖或改变问题表现;不要长期开着跑业务。

用 perf record 捕获卡点现场的调用栈

dmesg 只显示 “CPU#0 stuck for 22s” 但没给出完整调用栈,或者你想确认是不是某个模块反复自旋,perf 是最贴近真实的手段:

这个方法不依赖 lockdep,也不需要重启,适合在疑似软锁但尚未触发 watchdog 的阶段提前干预。

lslocks 只能看用户态文件锁,别误用它查内核死锁

lslocks 显示的是 flock()fcntl(F_SETLK) 这类 POSIX 文件锁,属于 VFS 层,跟内核自旋锁、互斥锁完全无关。它对排查软锁/硬锁毫无帮助:

容易忽略的一点:很多运维第一反应是 lslockslsof | grep LOCK,结果浪费半小时——先确认问题发生在哪一层,再选工具。

本文转载于:https://www.php.cn/faq/3030983.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。